IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
PythonDataItemUtils.h
Go to the documentation of this file.
1 // PythonDataItemUtils.h:
3 // ----------------------
4 //
14 
15 #ifndef __PYIPSDKBASE_PYTHONDATAITEMUTILS_H__
16 #define __PYIPSDKBASE_PYTHONDATAITEMUTILS_H__
17 
21 #include <IPSDKUtil/BaseTypes.h>
22 #include <boost/python/copy_const_reference.hpp>
23 #include <algorithm>
24 #include <iostream>
25 
26 namespace ipsdk {
27 namespace python {
28 
31 
33 PYIPSDKBASE_API std::string
34 toString( const BaseDataItem& dataItem);
35 
38 template <ipsdk::ipUInt32 g_nodeIdx, typename DataItemType, typename Enable = void>
39 struct DataItemNodeRegistrator;
40 
41 template <ipsdk::ipUInt32 g_nodeIdx, typename DataItemType>
42 struct DataItemNodeRegistrator<g_nodeIdx, DataItemType, typename boost::enable_if_c<g_nodeIdx == DataItemType::g_nbChildNodes>::type>
43 {
44  template <typename PyDataItem>
45  static void registerNode(PyDataItem& pyDataItem)
46  {
47 
48  }
49 };
50 
51 template <ipsdk::ipUInt32 g_nodeIdx, typename DataItemType>
52 struct DataItemNodeRegistrator<g_nodeIdx, DataItemType, typename boost::enable_if_c<g_nodeIdx < DataItemType::g_nbChildNodes>::type>
53 {
54  template <typename PyDataItem>
55  static void registerNode(PyDataItem& pyDataItem)
56  {
57  typedef typename DataItemType::template IdxToChildNode<g_nodeIdx>::ChildNodeType ChildNode;
58 
59  std::string nodeName = DataItemType::template getNodeNameStr<ChildNode>();
60  nodeName[0] = std::tolower(nodeName[0]);
61  registerNode<PyDataItem, ChildNode>(pyDataItem,
62  nodeName,
63  DataItemType::template getNodeToolTipStr<ChildNode>());
64  DataItemNodeRegistrator<g_nodeIdx+1, DataItemType>::registerNode(pyDataItem);
65  }
66 
67  template <typename PyDataItem, typename ChildNode>
68  static typename boost::enable_if_c<((ChildNode::NodeType::g_itemType == ipsdk::eDataItemType::eDIT_Leaf) &&
69  (ChildNode::NodeType::g_dataItemValueType != ipsdk::eDataItemValueType::eDIVT_Enum))>::type
70  registerNode(PyDataItem& pyDataItem,
71  const std::string& nodeName,
72  const std::string& nodeToolTip)
73  {
74  pyDataItem.add_property(nodeName.c_str(),
75  boost::python::make_function(&DataItemType::template getValue<ChildNode>,
76  boost::python::return_value_policy<boost::python::copy_const_reference>()),
77  &DataItemType::template setValue<ChildNode>,
78  nodeToolTip.c_str());
79  }
80 
81  template <typename PyDataItem, typename ChildNode>
82  static typename boost::enable_if_c<((ChildNode::NodeType::g_itemType == ipsdk::eDataItemType::eDIT_Leaf) &&
83  (ChildNode::NodeType::g_dataItemValueType == ipsdk::eDataItemValueType::eDIVT_Enum))>::type
84  registerNode(PyDataItem& pyDataItem,
85  const std::string& nodeName,
86  const std::string& nodeToolTip)
87  {
88  pyDataItem.add_property(nodeName.c_str(),
89  &DataItemType::template getValue<ChildNode>,
90  &DataItemType::template setValue<ChildNode>,
91  nodeToolTip.c_str());
92  }
93 
94  template <typename PyDataItem, typename ChildNode>
95  static typename boost::enable_if_c<ChildNode::NodeType::g_itemType == ipsdk::eDataItemType::eDIT_Node>::type
96  registerNode(PyDataItem& pyDataItem,
97  const std::string& nodeName,
98  const std::string& nodeToolTip)
99  {
100  typedef const typename DataItemType::template ChildNodeInfo<ChildNode>::NodeType& (DataItemType::*ConstGetter) () const;
101  typedef typename DataItemType::template ChildNodeInfo<ChildNode>::NodeType& (DataItemType::*MutableGetter) ();
102  pyDataItem.add_property(nodeName.c_str(),
103  boost::python::make_function(static_cast<ConstGetter>(&DataItemType::template getNode<ChildNode>),
104  boost::python::return_internal_reference<>()),
105  boost::python::make_function(static_cast<MutableGetter>(&DataItemType::template getNode<ChildNode>),
106  boost::python::return_internal_reference<>()),
107  nodeToolTip.c_str());
108  }
109 
110  template <typename PyDataItem, typename ChildNode>
111  static typename boost::enable_if_c<ChildNode::NodeType::g_itemType == ipsdk::eDataItemType::eDIT_LeafColl>::type
112  registerNode(PyDataItem& pyDataItem,
113  const std::string& nodeName,
114  const std::string& nodeToolTip)
115  {
116  typedef const typename DataItemType::template ChildNodeInfo<ChildNode>::CollType& (DataItemType::*ConstGetter) () const;
117  typedef typename DataItemType::template ChildNodeInfo<ChildNode>::CollType& (DataItemType::*MutableGetter) ();
118  pyDataItem.add_property(nodeName.c_str(),
119  boost::python::make_function(static_cast<ConstGetter>(&DataItemType::template getLeafColl<ChildNode>),
120  boost::python::return_internal_reference<>()),
121  boost::python::make_function(static_cast<MutableGetter>(&DataItemType::template getLeafColl<ChildNode>),
122  boost::python::return_internal_reference<>()),
123  nodeToolTip.c_str());
124  }
125 
126  template <typename PyDataItem, typename ChildNode>
127  static typename boost::enable_if_c<ChildNode::NodeType::g_itemType == ipsdk::eDataItemType::eDIT_NodeColl>::type
128  registerNode(PyDataItem& pyDataItem,
129  const std::string& nodeName,
130  const std::string& nodeToolTip)
131  {
132  typedef typename DataItemType::template ChildNodeInfo<ChildNode>::CollType CollType;
133  export_vector_no_str_no_proxy<CollType>(nodeName.c_str());
134  typedef const CollType& (DataItemType::*ConstGetter) () const;
135  typedef CollType& (DataItemType::*MutableGetter) ();
136  pyDataItem.add_property(nodeName.c_str(),
137  boost::python::make_function(static_cast<ConstGetter>(&DataItemType::template getNodeColl<ChildNode>),
138  boost::python::return_internal_reference<>()),
139  boost::python::make_function(static_cast<MutableGetter>(&DataItemType::template getNodeColl<ChildNode>),
140  boost::python::return_internal_reference<>()),
141  nodeToolTip.c_str());
142  }
143 
144 };
146 
149 
150 } // end of namespace python
151 } // end of namespace ipsdk
152 
153 #endif // __PYIPSDKBASE_PYTHONDATAITEMUTILS_H__
Utility functions for std::set python wrapping.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
#define PYIPSDKBASE_API
Import/Export macro for library PyIPSDKBase.
Definition: PyIPSDKBaseExports.h:25
Definition: DataItemNodeHdrMacrosDetails.h:48
Base types for multiplatform compatibility.
PYIPSDKBASE_API std::string toString(const BaseDataItem &dataItem)
function allowing to convert an IPSDK data item to a string representation
Data item associated to an enumerate value.
Definition: DataItemTypes.h:98
Definition: DataItemTypes.h:45
Predefined types for data items.
Definition of import/export macro for library.