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 5.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  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. /** \brief Abstract class providing common interface for Lemma Objects.
  19. * \details Lemma objects can be members of other Lemma, and may be members
  20. * of multiple objects. Since updates should be atomic, and objects
  21. * can be large, it becomes useful to count the number of
  22. * Classes an object is a member of.
  23. * Before C++-11, this was done internally in Lemma, with the inclusion of
  24. * more sophisticated smart pointers, this logic has been offloaded to the
  25. * standard. All Lemma objects should be created as C++-11 Smart pointers, using
  26. * the supplied New method. Calls to Delete are no longer necessary or available.
  27. */
  28. class LemmaObject {
  29. /**
  30. * Streams class information as YAML::Node
  31. */
  32. friend YAML::Emitter& operator << (YAML::Emitter& out, const LemmaObject &ob) ;
  33. friend class LemmaObjectDeleter;
  34. public:
  35. // ==================== LIFECYCLE ==============================
  36. // Needed because many derived classes have Eigen vectors as members,
  37. // causing alignment issues when vectorisation is enabled.
  38. EIGEN_MAKE_ALIGNED_OPERATOR_NEW
  39. // ==================== OPERATORS ==============================
  40. // ==================== OPERATIONS ==============================
  41. // ==================== ACCESS ==============================
  42. // ==================== INQUIRY ==============================
  43. /** Returns the name of the class, similiar to Python's type */
  44. std::string GetName() const;
  45. /**
  46. * Uses YAML to serialize this object.
  47. * @return a YAML::Node
  48. * FOR NOT LemmaObject does not write out any YAML info,
  49. * in the future the reference count could be logged? But the utility
  50. * of that is minimal.
  51. * @note Not every Lemma class needs to be Serializable, for instance HankelTransform
  52. * classes will never need to be Serialized. There may be a need to differentiate these
  53. * two families in to a LemmaInternalClass without serializing and perhaps this class for
  54. * all external classes that might need to be serialized.
  55. */
  56. virtual YAML::Node Serialize() const {
  57. YAML::Node node = YAML::Node();
  58. std::time_t now = std::chrono::system_clock::to_time_t( std::chrono::system_clock::now() );
  59. node["Serialized"] = std::ctime(&now);
  60. return node;
  61. };
  62. protected:
  63. // ==================== LIFECYCLE ==============================
  64. /** Protected default constructor. This is an abstract class and
  65. * cannot be instantiated.
  66. */
  67. LemmaObject (const std::string &name);
  68. /** Protected DeDerializing constructor, use factory DeSerialize method*/
  69. LemmaObject (const YAML::Node& node);
  70. /** Protected default destructor. This is an abstract class and
  71. * cannot be instantiated.
  72. */
  73. virtual ~LemmaObject();
  74. private:
  75. // ==================== DATA MEMBERS ==============================
  76. static const std::string CName;
  77. /** Stores an ASCII string representation of the class name */
  78. std::string Name;
  79. }; // ----- end of class LemmaObject -----
  80. class LemmaObjectDeleter
  81. {
  82. public:
  83. void operator()(LemmaObject* p) { delete p; }
  84. };
  85. // /////////////////////////////////////////////////////////////////
  86. // // BOILERPLATE MACROS
  87. // #define DESERIALIZECHECK( node, Object ) { \
  88. // if (node.Tag() != Object->GetName()) { \
  89. // throw DeSerializeTypeMismatch(Object, node.Tag()) ; \
  90. // } } \
  91. /////////////////////////////////////////////////////////////////
  92. // Error Classes
  93. /** Error called when DeSerializing breaks. If the node type is not the expected one
  94. * this error is thown.
  95. */
  96. class DeSerializeTypeMismatch : public std::runtime_error {
  97. public:
  98. DeSerializeTypeMismatch(const std::string& expected, const std::string& got);
  99. };
  100. /** If an assignment is made that is out of bounts, throw this.
  101. */
  102. class AssignmentOutOfBounds : public std::runtime_error {
  103. public:
  104. /** Throw when an assignment is out of bounds.
  105. * @param[in] ptr is a pointer to the class throwing the exception.
  106. */
  107. AssignmentOutOfBounds(LemmaObject *ptr);
  108. };
  109. /** If a pointer to a class is requested, but it is NULL valued, throw this
  110. */
  111. class RequestToReturnNullPointer : public std::runtime_error {
  112. public:
  113. /** Thrown when the pointer is NULL
  114. * @param[in] ptr is a pointer to the class throwing the exception.
  115. */
  116. RequestToReturnNullPointer(LemmaObject *ptr);
  117. };
  118. /** If an error in opening a .mat file is encountered, throw this.
  119. */
  120. class MatFileCannotBeOpened : public std::runtime_error {
  121. /** thown when a mat file fails to be opened.
  122. */
  123. public: MatFileCannotBeOpened();
  124. };
  125. /** Generic file I/O error. */
  126. class GenericFileIOError : public std::runtime_error {
  127. public: GenericFileIOError(LemmaObject *ptr, const std::string &filename);
  128. };
  129. }
  130. #endif // __LEMMAOBJECT_H