SMTK  @SMTK_VERSION@
Simulation Modeling Tool Kit
SharedFromThis.h
Go to the documentation of this file.
1 //=========================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 //
6 // This software is distributed WITHOUT ANY WARRANTY; without even
7 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
8 // PURPOSE. See the above copyright notice for more information.
9 //=========================================================================
10 #ifndef smtk_SharedFromThis_h
11 #define smtk_SharedFromThis_h
12 
16 #include "smtk/SharedPtr.h"
17 
18 #include <string>
19 
21 #define smtkTypedefs(...) \
22  typedef __VA_ARGS__ SelfType; \
23  typedef smtk::shared_ptr<__VA_ARGS__> Ptr; \
24  typedef smtk::shared_ptr<const __VA_ARGS__> ConstPtr; \
25  typedef smtk::weak_ptr<__VA_ARGS__> WeakPtr; \
26  typedef smtk::weak_ptr<const __VA_ARGS__> WeakConstPtr
27 
51 #define smtkTypeMacro(...) \
52  smtkTypedefs(__VA_ARGS__); \
53  static constexpr const char* const type_name = #__VA_ARGS__; \
54  std::string typeName() const override { return type_name; }
55 #define smtkTypeMacroBase(...) \
56  smtkTypedefs(__VA_ARGS__); \
57  static constexpr const char* const type_name = #__VA_ARGS__; \
58  virtual std::string typeName() const { return type_name; }
59 
62 
68 #define smtkTypenameMacro(...) \
69  static constexpr const char* const type_name = #__VA_ARGS__; \
70  std::string typeName() const override { return type_name; }
71 #define smtkTypenameMacroBase(...) \
72  static constexpr const char* const type_name = #__VA_ARGS__; \
73  virtual std::string typeName() const { return type_name; }
74 
87 #define smtkSuperclassMacro(...) \
88  typedef __VA_ARGS__ Superclass; \
89  typedef smtk::shared_ptr<__VA_ARGS__> SuperclassPtr
90 
113 #define smtkCreateMacro(...) \
114  static smtk::shared_ptr<SelfType> create() \
115  { \
116  smtk::shared_ptr<__VA_ARGS__> shared(new SelfType); \
117  return smtk::static_pointer_cast<SelfType>(shared); \
118  } \
119  /* variant for declarative programming: */ \
120  static smtk::shared_ptr<SelfType> create(smtk::shared_ptr<SelfType>& ref) \
121  { \
122  ref = SelfType::create(); \
123  return ref; \
124  }
125 
154 #define smtkEnableSharedPtr(...) \
155 public \
156  smtk::enable_shared_from_this<__VA_ARGS__>
157 
190 #define smtkSharedFromThisMacro(...) \
191  typedef __VA_ARGS__ SharedPtrBaseType; \
192  smtk::shared_ptr<SelfType> shared_from_this() \
193  { \
194  return smtk::static_pointer_cast<SelfType>(SharedPtrBaseType::shared_from_this()); \
195  } \
196  smtk::shared_ptr<const SelfType> shared_from_this() const \
197  { \
198  return smtk::static_pointer_cast<const SelfType>(SharedPtrBaseType::shared_from_this()); \
199  }
200 
207 #define smtkSharedPtrCreateMacro(...) \
208  smtkSharedFromThisMacro(__VA_ARGS__); \
209  smtkCreateMacro(__VA_ARGS__)
210 
242 #define smtkSharedPtrHelper(...) \
243  smtk::static_pointer_cast<SelfType>(SharedPtrBaseType::Ptr(__VA_ARGS__))
244 
245 #endif // smtk_SharedFromThis_h