IMP  2.0.1
The Integrative Modeling Platform
object_macros.h
Go to the documentation of this file.
1 /**
2  * \file IMP/base/object_macros.h
3  * \brief Various general useful macros for IMP.
4  *
5  * Copyright 2007-2013 IMP Inventors. All rights reserved.
6  *
7  */
8 
9 #ifndef IMPBASE_OBJECT_MACROS_H
10 #define IMPBASE_OBJECT_MACROS_H
11 #include <IMP/base/base_config.h>
12 #include "doxygen_macros.h"
13 #include "ref_counted_macros.h"
14 #include "Vector.h"
15 #include "Pointer.h"
16 #include "WeakPointer.h"
17 #include "SetLogState.h"
18 
19 
20 //! Define the basic things needed by any Object
21 /** This defines
22  - IMP::base::Object::get_version_info()
23  - a private destructor
24  and declares
25  - IMP::base::Object::do_show()
26 */
27 #define IMP_OBJECT_INLINE(Name, show, destructor) \
28  public: \
29  IMP_IMPLEMENT_INLINE( virtual ::IMP::base::VersionInfo \
30  get_version_info() const, \
31  return ::IMP::base::VersionInfo(get_module_name(), \
32  get_module_version())); \
33  IMP_REF_COUNTED_INLINE_DESTRUCTOR(Name, \
34  try { \
35  IMP::base::Object::_on_destruction(); \
36  destructor; \
37  } catch (const std::exception &e) { \
38  IMP_LOG_VARIABLE(e); \
39  IMP_WARN("Caught exception " \
40  << e.what() \
41  << " in destructor."); \
42  })
43 
44 
45 //! Use IMP_OBJECT_METHODS()
46 #define IMP_OBJECT(Name) \
47  public: \
48  IMP_IMPLEMENT_INLINE( virtual ::IMP::base::VersionInfo \
49  get_version_info() const, \
50  return ::IMP::base::VersionInfo(get_module_name(), \
51  get_module_version())); \
52  virtual void do_show(std::ostream &out) const; \
53 IMP_REF_COUNTED_INLINE_DESTRUCTOR(Name, IMP::base::Object::_on_destruction();)
54 
55 //! Define the basic things needed by any Object
56 /** This defines
57  - IMP::base::Object::get_version_info()
58  - IMP::base::Object::get_type_name()
59  - a private destructor
60 */
61 #define IMP_OBJECT_METHODS(Name) \
62  public: \
63  IMP_IMPLEMENT_INLINE( virtual ::IMP::base::VersionInfo \
64  get_version_info() const, \
65  return ::IMP::base::VersionInfo(get_module_name(), \
66  get_module_version())); \
67 IMP_REF_COUNTED_INLINE_DESTRUCTOR(Name, IMP::base::Object::_on_destruction();)
68 
69 #if IMP_HAS_DEPRECATED
70 //! for backwards compat
71 #define IMP_OBJECT_2(Name) IMP_OBJECT_METHODS(Name)
72 #endif
73 
74 //! Define the types for storing sets of objects
75 /** The macro defines the types PluralName and PluralNameTemp.
76  PluralName should be Names unless the English spelling is
77  different.
78  */
79 #define IMP_OBJECTS(Name, PluralName) \
80  /** Store a set of objects.*/ \
81  typedef IMP::base::Vector<IMP::base::Pointer<Name> > \
82  PluralName; \
83 /** Pass a set of objects.
84  \relates Name */ \
85  typedef IMP::base::Vector<IMP::base::WeakPointer<Name> > \
86  PluralName##Temp;
87 
88 #define IMP_GENERIC_OBJECT(Name, lcname, targument, carguments, cparguments) \
89  typedef Generic##Name<targument> Name; \
90  template <class targument> \
91  Generic##Name<targument>* create_##lcname carguments { \
92  return new Generic##Name<targument>cparguments; \
93  }
94 
95 //! Declare a ref counted pointer to a new object
96 /** \param[in] Typename The namespace qualified type being declared
97  \param[in] varname The name for the ref counted pointer
98  \param[in] args The arguments to the constructor, or ()
99  if there are none.
100  Please read the documentation for IMP::Pointer before using.
101 */
102 #define IMP_NEW(Typename, varname, args) \
103  IMP::base::Pointer<Typename> varname(new Typename args)
104 
105 #endif /* IMPBASE_OBJECT_MACROS_H */