Lemma is an Electromagnetics API
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

LemmaObject.h 6.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. /* This file is part of Lemma, a geophysical modelling and inversion API */
  2. /* This Source Code Form is subject to the terms of the Mozilla Public
  3. * License, v. 2.0. If a copy of the MPL was not distributed with this
  4. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  5. /**
  6. @file
  7. @author Trevor Irons
  8. @date 06-13-2016
  9. **/
  10. #ifndef __LEMMAOBJECT_H
  11. #define __LEMMAOBJECT_H
  12. #include "helper.h"
  13. #include "lemma.h"
  14. #include "yaml-cpp/yaml.h"
  15. #include <chrono>
  16. #include <memory>
  17. namespace Lemma {
  18. /**
  19. * \ingroup LemmaCore
  20. * \brief Abstract class providing common interface for Lemma Objects.
  21. * \details Lemma objects can be members of other Lemma, and may be members
  22. * of multiple objects. Since updates should be atomic, and objects
  23. * can be large, it becomes useful to count the number of
  24. * Classes an object is a member of.
  25. * Before C++-11, this was done internally in Lemma, with the inclusion of
  26. * more sophisticated smart pointers, this logic has been offloaded to the
  27. * standard. All Lemma objects should be created as C++-11 Smart pointers, using
  28. * the supplied New method. Calls to Delete are no longer necessary or available.
  29. */
  30. class LemmaObject {
  31. /**
  32. * Streams class information as YAML::Node
  33. */
  34. friend YAML::Emitter& operator << (YAML::Emitter& out, const LemmaObject &ob) ;
  35. friend class LemmaObjectDeleter;
  36. public:
  37. // Needed because many derived classes have Eigen vectors as members,
  38. // causing alignment issues when vectorisation is enabled.
  39. EIGEN_MAKE_ALIGNED_OPERATOR_NEW
  40. // ==================== LIFECYCLE ==============================
  41. /**
  42. * Uses YAML to serialize this object.
  43. * @return a YAML::Node
  44. * FOR NOT LemmaObject does not write out any YAML info,
  45. * in the future the reference count could be logged? But the utility
  46. * of that is minimal.
  47. * @note Not every Lemma class needs to be Serializable, for instance HankelTransform
  48. * classes will never need to be Serialized. There may be a need to differentiate these
  49. * two families in to a LemmaInternalClass without serializing and perhaps this class for
  50. * all external classes that might need to be serialized.
  51. */
  52. virtual YAML::Node Serialize() const {
  53. std::cout.precision( 21 );
  54. YAML::Node node = YAML::Node();
  55. node.SetTag( GetName() );
  56. std::time_t now = std::chrono::system_clock::to_time_t( std::chrono::system_clock::now() );
  57. node["Serialized"] = std::ctime(&now);
  58. node["Lemma_VERSION"] = LEMMA_VERSION;
  59. return node;
  60. };
  61. // ==================== OPERATORS ==============================
  62. // ==================== OPERATIONS ==============================
  63. // ==================== ACCESS ==============================
  64. // ==================== INQUIRY ==============================
  65. /** Returns the name of the underlying class; Run-time type information (RTTI). This approach
  66. Was chosen over typeid due to name mangling among various compilers, and the need for consistency
  67. in Serialized objects.
  68. */
  69. virtual inline std::string GetName() const {
  70. return this->CName;
  71. }
  72. protected:
  73. // ==================== LIFECYCLE ==============================
  74. /** Protected default constructor. This is an abstract class and
  75. * cannot be instantiated.
  76. */
  77. LemmaObject ( );
  78. /** Protected DeSerializing constructor */
  79. LemmaObject (const YAML::Node& node);
  80. LemmaObject( const LemmaObject& ) = delete;
  81. /** Protected default destructor. This is an abstract class and
  82. * cannot be instantiated. Virtual is necessary so that if base class destructor is
  83. * called, we get the right behaviour.
  84. */
  85. virtual ~LemmaObject();
  86. private:
  87. // ==================== DATA MEMBERS ==============================
  88. /** ASCII string representation of the class name */
  89. static constexpr auto CName = "LemmaObject";
  90. }; // ----- end of class LemmaObject -----
  91. class LemmaObjectDeleter
  92. {
  93. public:
  94. void operator()(LemmaObject* p) { delete p; }
  95. };
  96. /////////////////////////////////////////////////////////////////
  97. // Error Classes
  98. /** Error called when DeSerializing breaks. If the node type is not the expected one
  99. * this error is thown.
  100. */
  101. class DeSerializeTypeMismatch : public std::runtime_error {
  102. public:
  103. DeSerializeTypeMismatch(const std::string& expected, const std::string& got);
  104. };
  105. /** If an assignment is made that is out of bounts, throw this.
  106. */
  107. class AssignmentOutOfBounds : public std::runtime_error {
  108. public:
  109. /** Throw when an assignment is out of bounds.
  110. * @param[in] ptr is a pointer to the class throwing the exception.
  111. */
  112. AssignmentOutOfBounds(LemmaObject *ptr);
  113. };
  114. /** If a pointer to a class is requested, but it is NULL valued, throw this
  115. */
  116. class RequestToReturnNullPointer : public std::runtime_error {
  117. public:
  118. /** Thrown when the pointer is NULL
  119. * @param[in] ptr is a pointer to the class throwing the exception.
  120. */
  121. RequestToReturnNullPointer(LemmaObject *ptr);
  122. };
  123. /** If an error in opening a .mat file is encountered, throw this.
  124. */
  125. class MatFileCannotBeOpened : public std::runtime_error {
  126. /** thown when a mat file fails to be opened.
  127. */
  128. public: MatFileCannotBeOpened();
  129. };
  130. /** Generic file I/O error. */
  131. class GenericFileIOError : public std::runtime_error {
  132. public: GenericFileIOError(LemmaObject *ptr, const std::string &filename);
  133. };
  134. }
  135. #endif // __LEMMAOBJECT_H