IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
DataItemNodeSrcMacros.h
Go to the documentation of this file.
1 // DataItemNodeSrcMacros.h:
3 // ------------------------
4 //
14 
15 #ifndef __IPSDKBASEDATA_DATAITEMNODESRCMACROS_H__
16 #define __IPSDKBASEDATA_DATAITEMNODESRCMACROS_H__
17 
20 #include <IPSDKBaseData/DataItem/Node/DataItemNodeFactory.h>
22 #include <boost/thread/lock_guard.hpp>
23 #include <boost/make_shared.hpp>
24 
25 // mutex used to protect data for concurrent accesses
26 IPSDK_STATIC_MUTEX(DataItemNodeMutex);
27 
30 
33 #define IPSDK_MAX_SUB_NODES_COUNT 20
34 
37 #define IPSDK_IMPLEMENT_NODE_STR_MACRO(z, n, seqInfo) \
38  template IPSDK_LIB_API(BOOST_PP_SEQ_ELEM(0, seqInfo)) \
39  const std::string& \
40  BOOST_PP_SEQ_ELEM(1, seqInfo)::getNodeNameStr<n>(); \
41  template IPSDK_LIB_API(BOOST_PP_SEQ_ELEM(0, seqInfo)) \
42  const std::string& \
43  BOOST_PP_SEQ_ELEM(1, seqInfo)::getNodeToolTipStr<n>();
44 
47 #define IPSDK_IMPLEMENT_NODE_DATA_BODY(libraryName, namespaceSeq, className, eMsgEnum) \
48  IPSDK_IMPLEMENT_SERIAL_WITH_COPY(libraryName, namespaceSeq, className, 1) \
49  IPSDK_IMPLEMENT_TOOLTIP(libraryName, className, eMsgEnum) \
50  template <typename MsgEnumType> \
51  std::string className::createMessage(const MsgEnumType& msg) { \
52  ipsdk::LogMessageFormater logMessageFormater( \
53  IPSDK_LIB_LOG_MSG_MANAGER(libraryName)); \
54  logMessageFormater[msg]; \
55  return logMessageFormater.string(); \
56  } \
57  template <ipsdk::ipUInt32 g_childNodeIdx> IPSDK_LIB_API(libraryName) \
58  typename boost::enable_if_c<boost::mpl::less< \
59  boost::mpl::int_<g_childNodeIdx>, \
60  boost::mpl::int_<className::g_nbChildNodes> >::value, \
61  const std::string&>::type \
62  className::getNodeNameStr() { \
63  typedef typename IdxToChildNode<g_childNodeIdx>::ChildNodeType ChildNodeType; \
64  const ItemInfoStr& itemInfoStr = ChildNodeInfo<ChildNodeType>::template \
65  getItemInfoStr<eMsgEnum>(); \
66  return itemInfoStr._itemName; \
67  } \
68  template <ipsdk::ipUInt32 g_childNodeIdx> IPSDK_LIB_API(libraryName) \
69  typename boost::enable_if_c<boost::mpl::greater_equal< \
70  boost::mpl::int_<g_childNodeIdx>, \
71  boost::mpl::int_<className::g_nbChildNodes> >::value, \
72  const std::string&>::type \
73  className::getNodeNameStr() { \
74  static const std::string g_emptyString; \
75  return g_emptyString; \
76  } \
77  template <ipsdk::ipUInt32 g_childNodeIdx> IPSDK_LIB_API(libraryName) \
78  typename boost::enable_if_c<boost::mpl::less< \
79  boost::mpl::int_<g_childNodeIdx>, \
80  boost::mpl::int_<className::g_nbChildNodes> >::value, \
81  const std::string&>::type \
82  className::getNodeToolTipStr() { \
83  typedef typename IdxToChildNode<g_childNodeIdx>::ChildNodeType ChildNodeType; \
84  const ItemInfoStr& itemInfoStr = ChildNodeInfo<ChildNodeType>::template \
85  getItemInfoStr<eMsgEnum>(); \
86  return itemInfoStr._itemToolTip; \
87  } \
88  template <ipsdk::ipUInt32 g_childNodeIdx> IPSDK_LIB_API(libraryName) \
89  typename boost::enable_if_c<boost::mpl::greater_equal< \
90  boost::mpl::int_<g_childNodeIdx>, \
91  boost::mpl::int_<className::g_nbChildNodes> >::value, \
92  const std::string&>::type \
93  className::getNodeToolTipStr() { \
94  static const std::string g_emptyString; \
95  return g_emptyString; \
96  } \
97  BOOST_PP_REPEAT(IPSDK_MAX_SUB_NODES_COUNT, IPSDK_IMPLEMENT_NODE_STR_MACRO, \
98  (libraryName)(className)); \
99  const ipsdk::ItemNames& className::getItemIds() const { \
100  boost::lock_guard<boost::mutex> lock(DataItemNodeMutex::get()); \
101  return delayedGetItemIds<void>(); \
102  } \
103  className::ItemInfoPtr className::getItemInfo(const std::string& itemId) const { \
104  const ItemInfoPtr& pItemInfo = delayedGetItemInfo<eMsgEnum>(itemId); \
105  return pItemInfo; \
106  } \
107  ipsdk::DataItemNodePtr className::createBaseNode() { \
108  return boost::make_shared<className>(); \
109  } \
110  boost::shared_ptr<className> className::createNode() { \
111  return boost::make_shared<className>(); \
112  } \
113  namespace ipsdk { \
114  template <typename T> \
115  struct NodeRegistrator; \
116  template <> \
117  struct NodeRegistrator<className> { \
118  NodeRegistrator() \
119  { \
120  MessageMapRegistrator<eMsgEnum>::process(); \
121  DataItemNodeFactory& factory = DataItemNodeFactory::getInstance(); \
122  factory.registerNode<className>(); \
123  } \
124  ~NodeRegistrator() \
125  { \
126  DataItemNodeFactory& factory = DataItemNodeFactory::getInstance(); \
127  factory.unRegisterNode<className>(); \
128  } \
129  static NodeRegistrator g_bNodeRegistrator; \
130  }; \
131  NodeRegistrator<className> NodeRegistrator<className>::g_bNodeRegistrator; \
132  } \
133  boost::mutex& className::getDataItemNodeMutex() \
134  { \
135  return DataItemNodeMutex::get(); \
136  }
137 
140 #define IPSDK_IMPLEMENT_NODE_DATA(libraryName, namespaceSeq, className, eMsgEnum) \
141  IPSDK_IMPLEMENT_NODE_DATA_BODY(libraryName, namespaceSeq, className, eMsgEnum) \
142  IPSDK_IMPLEMENT_SERIAL_WRITE(className, BaseDataItemNode) \
143  delayedWriteNode<void>(ar); \
144  return true; \
145  } \
146  IPSDK_IMPLEMENT_SERIAL_READ(className, BaseDataItemNode) \
147  delayedReadNode<void>(ar); \
148  return true; \
149  } \
150  IPSDK_IMPLEMENT_COPY(className, BaseDataItemNode) \
151  delayedCopyNode<void>(pObject); \
152  }
153 
156 
157 #endif // __IPSDKBASEDATA_DATAITEMNODESRCMACROS_H__
Source part of macros set for ToolTip class declaration.
Macros allowing to define a getter to a static mutex.
#define IPSDK_STATIC_MUTEX(MutexName)
macro allowing to create a static mutex
Definition: MutexMacros.h:27
Source part of macros set for class serialization.