Skip to content

Commit c0a539d

Browse files
committed
Separated node bindings to separate compilation units to reduce memory requirements
1 parent 10b0d54 commit c0a539d

28 files changed

+1988
-1320
lines changed

CMakeLists.txt

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,11 +96,34 @@ pybind11_add_module(${TARGET_NAME}
9696
src/DatatypeBindings.cpp
9797
src/DataQueueBindings.cpp
9898
src/pipeline/PipelineBindings.cpp
99-
src/pipeline/NodeBindings.cpp
10099
src/pipeline/CommonBindings.cpp
101100
src/pipeline/AssetManagerBindings.cpp
102101
src/openvino/OpenVINOBindings.cpp
103102
src/log/LogBindings.cpp
103+
104+
src/pipeline/node/NodeBindings.cpp
105+
106+
src/pipeline/node/XLinkInBindings.cpp
107+
src/pipeline/node/XLinkOutBindings.cpp
108+
src/pipeline/node/ColorCameraBindings.cpp
109+
src/pipeline/node/MonoCameraBindings.cpp
110+
src/pipeline/node/StereoDepthBindings.cpp
111+
src/pipeline/node/NeuralNetworkBindings.cpp
112+
src/pipeline/node/VideoEncoderBindings.cpp
113+
src/pipeline/node/ImageManipBindings.cpp
114+
src/pipeline/node/SPIOutBindings.cpp
115+
src/pipeline/node/SPIInBindings.cpp
116+
src/pipeline/node/DetectionNetworkBindings.cpp
117+
src/pipeline/node/SystemLoggerBindings.cpp
118+
src/pipeline/node/ScriptBindings.cpp
119+
src/pipeline/node/SpatialLocationCalculatorBindings.cpp
120+
src/pipeline/node/SpatialDetectionNetworkBindings.cpp
121+
src/pipeline/node/ObjectTrackerBindings.cpp
122+
src/pipeline/node/IMUBindings.cpp
123+
src/pipeline/node/EdgeDetectorBindings.cpp
124+
src/pipeline/node/FeatureTrackerBindings.cpp
125+
src/pipeline/node/AprilTagBindings.cpp
126+
src/pipeline/node/DetectionParserBindings.cpp
104127
)
105128

106129
if(WIN32)

src/pipeline/NodeBindings.cpp

Lines changed: 0 additions & 1315 deletions
This file was deleted.

src/pipeline/PipelineBindings.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
#include "PipelineBindings.hpp"
3-
#include "NodeBindings.hpp"
3+
#include "node/NodeBindings.hpp"
44

55
// depthai
66
#include "depthai/pipeline/Pipeline.hpp"
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
#include "NodeBindings.hpp"
2+
#include "Common.hpp"
3+
4+
#include "depthai/pipeline/Pipeline.hpp"
5+
#include "depthai/pipeline/Node.hpp"
6+
#include "depthai/pipeline/node/AprilTag.hpp"
7+
8+
void bind_apriltag(pybind11::module& m, void* pCallstack){
9+
10+
using namespace dai;
11+
using namespace dai::node;
12+
13+
// Node and Properties declare upfront
14+
py::class_<AprilTagProperties> aprilTagProperties(m, "AprilTagProperties", DOC(dai, AprilTagProperties));
15+
auto aprilTag = ADD_NODE(AprilTag);
16+
17+
///////////////////////////////////////////////////////////////////////
18+
///////////////////////////////////////////////////////////////////////
19+
///////////////////////////////////////////////////////////////////////
20+
// Call the rest of the type defines, then perform the actual bindings
21+
Callstack* callstack = (Callstack*) pCallstack;
22+
auto cb = callstack->top();
23+
callstack->pop();
24+
cb(m, pCallstack);
25+
// Actual bindings
26+
///////////////////////////////////////////////////////////////////////
27+
///////////////////////////////////////////////////////////////////////
28+
///////////////////////////////////////////////////////////////////////
29+
30+
// Properties
31+
aprilTagProperties
32+
.def_readwrite("initialConfig", &AprilTagProperties::initialConfig, DOC(dai, AprilTagProperties, initialConfig))
33+
.def_readwrite("inputConfigSync", &AprilTagProperties::inputConfigSync, DOC(dai, AprilTagProperties, inputConfigSync))
34+
;
35+
// Node
36+
aprilTag
37+
.def_readonly("inputConfig", &AprilTag::inputConfig, DOC(dai, node, AprilTag, inputConfig))
38+
.def_readonly("inputImage", &AprilTag::inputImage, DOC(dai, node, AprilTag, inputImage))
39+
.def_readonly("out", &AprilTag::out, DOC(dai, node, AprilTag, out))
40+
.def_readonly("passthroughInputImage", &AprilTag::passthroughInputImage, DOC(dai, node, AprilTag, passthroughInputImage))
41+
.def_readonly("initialConfig", &AprilTag::initialConfig, DOC(dai, node, AprilTag, initialConfig))
42+
.def("setWaitForConfigInput", &AprilTag::setWaitForConfigInput, py::arg("wait"), DOC(dai, node, AprilTag, setWaitForConfigInput))
43+
;
44+
daiNodeModule.attr("AprilTag").attr("Properties") = aprilTagProperties;
45+
46+
}
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
#include "NodeBindings.hpp"
2+
#include "Common.hpp"
3+
4+
#include "depthai/pipeline/Pipeline.hpp"
5+
#include "depthai/pipeline/Node.hpp"
6+
#include "depthai/pipeline/node/ColorCamera.hpp"
7+
8+
void bind_colorcamera(pybind11::module& m, void* pCallstack){
9+
10+
using namespace dai;
11+
using namespace dai::node;
12+
13+
// Node and Properties declare upfront
14+
py::class_<ColorCameraProperties> colorCameraProperties(m, "ColorCameraProperties", DOC(dai, ColorCameraProperties));
15+
py::enum_<ColorCameraProperties::SensorResolution> colorCameraPropertiesSensorResolution(colorCameraProperties, "SensorResolution", DOC(dai, ColorCameraProperties, SensorResolution));
16+
py::enum_<ColorCameraProperties::ColorOrder> colorCameraPropertiesColorOrder(colorCameraProperties, "ColorOrder", DOC(dai, ColorCameraProperties, ColorOrder));
17+
auto colorCamera = ADD_NODE(ColorCamera);
18+
19+
///////////////////////////////////////////////////////////////////////
20+
///////////////////////////////////////////////////////////////////////
21+
///////////////////////////////////////////////////////////////////////
22+
// Call the rest of the type defines, then perform the actual bindings
23+
Callstack* callstack = (Callstack*) pCallstack;
24+
auto cb = callstack->top();
25+
callstack->pop();
26+
cb(m, pCallstack);
27+
// Actual bindings
28+
///////////////////////////////////////////////////////////////////////
29+
///////////////////////////////////////////////////////////////////////
30+
///////////////////////////////////////////////////////////////////////
31+
32+
// ColorCamera Properties
33+
colorCameraPropertiesSensorResolution
34+
.value("THE_1080_P", ColorCameraProperties::SensorResolution::THE_1080_P)
35+
.value("THE_4_K", ColorCameraProperties::SensorResolution::THE_4_K)
36+
.value("THE_12_MP", ColorCameraProperties::SensorResolution::THE_12_MP)
37+
.value("THE_13_MP", ColorCameraProperties::SensorResolution::THE_13_MP)
38+
.value("THE_720_P", ColorCameraProperties::SensorResolution::THE_720_P)
39+
.value("THE_800_P", ColorCameraProperties::SensorResolution::THE_800_P)
40+
;
41+
42+
colorCameraPropertiesColorOrder
43+
.value("BGR", ColorCameraProperties::ColorOrder::BGR)
44+
.value("RGB", ColorCameraProperties::ColorOrder::RGB)
45+
;
46+
47+
colorCameraProperties
48+
.def_readwrite("initialControl", &ColorCameraProperties::initialControl)
49+
.def_readwrite("boardSocket", &ColorCameraProperties::boardSocket)
50+
.def_readwrite("imageOrientation", &ColorCameraProperties::imageOrientation)
51+
.def_readwrite("colorOrder", &ColorCameraProperties::colorOrder)
52+
.def_readwrite("interleaved", &ColorCameraProperties::interleaved)
53+
.def_readwrite("fp16", &ColorCameraProperties::fp16)
54+
.def_readwrite("previewHeight", &ColorCameraProperties::previewHeight)
55+
.def_readwrite("previewWidth", &ColorCameraProperties::previewWidth)
56+
.def_readwrite("videoHeight", &ColorCameraProperties::videoHeight)
57+
.def_readwrite("videoWidth", &ColorCameraProperties::videoWidth)
58+
.def_readwrite("stillHeight", &ColorCameraProperties::stillHeight)
59+
.def_readwrite("stillWidth", &ColorCameraProperties::stillWidth)
60+
.def_readwrite("resolution", &ColorCameraProperties::resolution)
61+
.def_readwrite("fps", &ColorCameraProperties::fps)
62+
.def_readwrite("sensorCropX", &ColorCameraProperties::sensorCropX)
63+
.def_readwrite("sensorCropY", &ColorCameraProperties::sensorCropY)
64+
.def_readwrite("previewKeepAspectRatio", &ColorCameraProperties::previewKeepAspectRatio)
65+
.def_readwrite("ispScale", &ColorCameraProperties::ispScale)
66+
.def_readwrite("numFramesPoolRaw", &ColorCameraProperties::numFramesPoolRaw)
67+
.def_readwrite("numFramesPoolIsp", &ColorCameraProperties::numFramesPoolIsp)
68+
.def_readwrite("numFramesPoolVideo", &ColorCameraProperties::numFramesPoolVideo)
69+
.def_readwrite("numFramesPoolPreview", &ColorCameraProperties::numFramesPoolPreview)
70+
.def_readwrite("numFramesPoolStill", &ColorCameraProperties::numFramesPoolStill)
71+
;
72+
73+
// ColorCamera node
74+
colorCamera
75+
.def_readonly("inputConfig", &ColorCamera::inputConfig, DOC(dai, node, ColorCamera, inputConfig))
76+
.def_readonly("inputControl", &ColorCamera::inputControl, DOC(dai, node, ColorCamera, inputControl))
77+
.def_readonly("initialControl", &ColorCamera::initialControl, DOC(dai, node, ColorCamera, initialControl))
78+
.def_readonly("video", &ColorCamera::video, DOC(dai, node, ColorCamera, video))
79+
.def_readonly("preview", &ColorCamera::preview, DOC(dai, node, ColorCamera, preview))
80+
.def_readonly("still", &ColorCamera::still, DOC(dai, node, ColorCamera, still))
81+
.def_readonly("isp", &ColorCamera::isp, DOC(dai, node, ColorCamera, isp))
82+
.def_readonly("raw", &ColorCamera::raw, DOC(dai, node, ColorCamera, raw))
83+
.def("setCamId", [](ColorCamera& c, int64_t id) {
84+
// Issue an deprecation warning
85+
PyErr_WarnEx(PyExc_DeprecationWarning, "setCamId() is deprecated, use setBoardSocket() instead.", 1);
86+
HEDLEY_DIAGNOSTIC_PUSH
87+
HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
88+
c.setCamId(id);
89+
HEDLEY_DIAGNOSTIC_POP
90+
})
91+
.def("getCamId", [](ColorCamera& c) {
92+
// Issue an deprecation warning
93+
PyErr_WarnEx(PyExc_DeprecationWarning, "getCamId() is deprecated, use getBoardSocket() instead.", 1);
94+
HEDLEY_DIAGNOSTIC_PUSH
95+
HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
96+
return c.getCamId();
97+
HEDLEY_DIAGNOSTIC_POP
98+
})
99+
.def("setBoardSocket", &ColorCamera::setBoardSocket, py::arg("boardSocket"), DOC(dai, node, ColorCamera, setBoardSocket))
100+
.def("getBoardSocket", &ColorCamera::getBoardSocket, DOC(dai, node, ColorCamera, getBoardSocket))
101+
.def("setImageOrientation", &ColorCamera::setImageOrientation, py::arg("imageOrientation"), DOC(dai, node, ColorCamera, setImageOrientation))
102+
.def("getImageOrientation", &ColorCamera::getImageOrientation, DOC(dai, node, ColorCamera, getImageOrientation))
103+
.def("setColorOrder", &ColorCamera::setColorOrder, py::arg("colorOrder"), DOC(dai, node, ColorCamera, setColorOrder))
104+
.def("getColorOrder", &ColorCamera::getColorOrder, DOC(dai, node, ColorCamera, getColorOrder))
105+
.def("setInterleaved", &ColorCamera::setInterleaved, py::arg("interleaved"), DOC(dai, node, ColorCamera, setInterleaved))
106+
.def("getInterleaved", &ColorCamera::getInterleaved, DOC(dai, node, ColorCamera, getInterleaved))
107+
.def("setFp16", &ColorCamera::setFp16, py::arg("fp16"), DOC(dai, node, ColorCamera, setFp16))
108+
.def("getFp16", &ColorCamera::getFp16, DOC(dai, node, ColorCamera, getFp16))
109+
.def("setPreviewSize", static_cast<void(ColorCamera::*)(int,int)>(&ColorCamera::setPreviewSize), py::arg("width"), py::arg("height"), DOC(dai, node, ColorCamera, setPreviewSize))
110+
.def("setPreviewSize", static_cast<void(ColorCamera::*)(std::tuple<int,int>)>(&ColorCamera::setPreviewSize), py::arg("size"), DOC(dai, node, ColorCamera, setPreviewSize, 2))
111+
.def("setVideoSize", static_cast<void(ColorCamera::*)(int,int)>(&ColorCamera::setVideoSize), py::arg("width"), py::arg("height"), DOC(dai, node, ColorCamera, setVideoSize))
112+
.def("setVideoSize", static_cast<void(ColorCamera::*)(std::tuple<int,int>)>(&ColorCamera::setVideoSize), py::arg("size"), DOC(dai, node, ColorCamera, setVideoSize, 2))
113+
.def("setStillSize", static_cast<void(ColorCamera::*)(int,int)>(&ColorCamera::setStillSize), py::arg("width"), py::arg("height"), DOC(dai, node, ColorCamera, setStillSize))
114+
.def("setStillSize", static_cast<void(ColorCamera::*)(std::tuple<int,int>)>(&ColorCamera::setStillSize), py::arg("size"), DOC(dai, node, ColorCamera, setStillSize, 2))
115+
.def("setResolution", &ColorCamera::setResolution, py::arg("resolution"), DOC(dai, node, ColorCamera, setResolution))
116+
.def("getResolution", &ColorCamera::getResolution, DOC(dai, node, ColorCamera, getResolution))
117+
.def("setFps", &ColorCamera::setFps, py::arg("fps"), DOC(dai, node, ColorCamera, setFps))
118+
.def("getFps", &ColorCamera::getFps, DOC(dai, node, ColorCamera, getFps))
119+
.def("getPreviewSize", &ColorCamera::getPreviewSize, DOC(dai, node, ColorCamera, getPreviewSize))
120+
.def("getPreviewWidth", &ColorCamera::getPreviewWidth, DOC(dai, node, ColorCamera, getPreviewWidth))
121+
.def("getPreviewHeight", &ColorCamera::getPreviewHeight, DOC(dai, node, ColorCamera, getPreviewHeight))
122+
.def("getVideoSize", &ColorCamera::getVideoSize, DOC(dai, node, ColorCamera, getVideoSize))
123+
.def("getVideoWidth", &ColorCamera::getVideoWidth, DOC(dai, node, ColorCamera, getVideoWidth))
124+
.def("getVideoHeight", &ColorCamera::getVideoHeight, DOC(dai, node, ColorCamera, getVideoHeight))
125+
.def("getStillSize", &ColorCamera::getStillSize, DOC(dai, node, ColorCamera, getStillSize))
126+
.def("getStillWidth", &ColorCamera::getStillWidth, DOC(dai, node, ColorCamera, getStillWidth))
127+
.def("getStillHeight", &ColorCamera::getStillHeight, DOC(dai, node, ColorCamera, getStillHeight))
128+
.def("getResolutionSize", &ColorCamera::getResolutionSize, DOC(dai, node, ColorCamera, getResolutionSize))
129+
.def("getResolutionWidth", &ColorCamera::getResolutionWidth, DOC(dai, node, ColorCamera, getResolutionWidth))
130+
.def("getResolutionHeight", &ColorCamera::getResolutionHeight, DOC(dai, node, ColorCamera, getResolutionHeight))
131+
.def("sensorCenterCrop", &ColorCamera::sensorCenterCrop, DOC(dai, node, ColorCamera, sensorCenterCrop))
132+
.def("setSensorCrop", &ColorCamera::setSensorCrop, py::arg("x"), py::arg("y"), DOC(dai, node, ColorCamera, setSensorCrop))
133+
.def("getSensorCrop", &ColorCamera::getSensorCrop, DOC(dai, node, ColorCamera, getSensorCrop))
134+
.def("getSensorCropX", &ColorCamera::getSensorCropX, DOC(dai, node, ColorCamera, getSensorCropX))
135+
.def("getSensorCropY", &ColorCamera::getSensorCropY, DOC(dai, node, ColorCamera, getSensorCropY))
136+
137+
.def("setWaitForConfigInput", [](ColorCamera& cam, bool wait){
138+
// Issue a deprecation warning
139+
PyErr_WarnEx(PyExc_DeprecationWarning, "Use 'inputConfig.setWaitForMessage()' instead", 1);
140+
HEDLEY_DIAGNOSTIC_PUSH
141+
HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
142+
cam.setWaitForConfigInput(wait);
143+
HEDLEY_DIAGNOSTIC_POP
144+
}, py::arg("wait"), DOC(dai, node, ColorCamera, setWaitForConfigInput))
145+
146+
.def("getWaitForConfigInput", [](ColorCamera& cam){
147+
// Issue a deprecation warning
148+
PyErr_WarnEx(PyExc_DeprecationWarning, "Use 'inputConfig.setWaitForMessage()' instead", 1);
149+
HEDLEY_DIAGNOSTIC_PUSH
150+
HEDLEY_DIAGNOSTIC_DISABLE_DEPRECATED
151+
return cam.getWaitForConfigInput();
152+
HEDLEY_DIAGNOSTIC_POP
153+
}, DOC(dai, node, ColorCamera, getWaitForConfigInput))
154+
155+
.def("setPreviewKeepAspectRatio", &ColorCamera::setPreviewKeepAspectRatio, py::arg("keep"), DOC(dai, node, ColorCamera, setPreviewKeepAspectRatio))
156+
.def("getPreviewKeepAspectRatio", &ColorCamera::getPreviewKeepAspectRatio, DOC(dai, node, ColorCamera, getPreviewKeepAspectRatio))
157+
.def("setIspScale", static_cast<void(ColorCamera::*)(int,int)>(&ColorCamera::setIspScale), py::arg("numerator"), py::arg("denominator"), DOC(dai, node, ColorCamera, setIspScale))
158+
.def("setIspScale", static_cast<void(ColorCamera::*)(std::tuple<int,int>)>(&ColorCamera::setIspScale), py::arg("scale"), DOC(dai, node, ColorCamera, setIspScale, 2))
159+
.def("setIspScale", static_cast<void(ColorCamera::*)(int,int,int,int)>(&ColorCamera::setIspScale), py::arg("horizNum"), py::arg("horizDenom"), py::arg("vertNum"), py::arg("vertDenom"), DOC(dai, node, ColorCamera, setIspScale, 3))
160+
.def("setIspScale", static_cast<void(ColorCamera::*)(std::tuple<int,int>,std::tuple<int,int>)>(&ColorCamera::setIspScale), py::arg("horizScale"), py::arg("vertScale"), DOC(dai, node, ColorCamera, setIspScale, 4))
161+
.def("getIspSize", &ColorCamera::getIspSize, DOC(dai, node, ColorCamera, getIspSize))
162+
.def("getIspWidth", &ColorCamera::getIspWidth, DOC(dai, node, ColorCamera, getIspWidth))
163+
.def("getIspHeight", &ColorCamera::getIspHeight, DOC(dai, node, ColorCamera, getIspHeight))
164+
165+
.def("setPreviewNumFramesPool", &ColorCamera::setPreviewNumFramesPool, DOC(dai, node, ColorCamera, setPreviewNumFramesPool))
166+
.def("setVideoNumFramesPool", &ColorCamera::setVideoNumFramesPool, DOC(dai, node, ColorCamera, setVideoNumFramesPool))
167+
.def("setStillNumFramesPool", &ColorCamera::setStillNumFramesPool, DOC(dai, node, ColorCamera, setStillNumFramesPool))
168+
.def("setRawNumFramesPool", &ColorCamera::setRawNumFramesPool, DOC(dai, node, ColorCamera, setRawNumFramesPool))
169+
.def("setIspNumFramesPool", &ColorCamera::setIspNumFramesPool, DOC(dai, node, ColorCamera, setIspNumFramesPool))
170+
.def("setNumFramesPool", &ColorCamera::setNumFramesPool, py::arg("raw"), py::arg("isp"), py::arg("preview"), py::arg("video"), py::arg("still"), DOC(dai, node, ColorCamera, setNumFramesPool))
171+
172+
.def("getPreviewNumFramesPool", &ColorCamera::getPreviewNumFramesPool, DOC(dai, node, ColorCamera, getPreviewNumFramesPool))
173+
.def("getVideoNumFramesPool", &ColorCamera::getVideoNumFramesPool, DOC(dai, node, ColorCamera, getVideoNumFramesPool))
174+
.def("getStillNumFramesPool", &ColorCamera::getStillNumFramesPool, DOC(dai, node, ColorCamera, getStillNumFramesPool))
175+
.def("getRawNumFramesPool", &ColorCamera::getRawNumFramesPool, DOC(dai, node, ColorCamera, getRawNumFramesPool))
176+
.def("getIspNumFramesPool", &ColorCamera::getIspNumFramesPool, DOC(dai, node, ColorCamera, getIspNumFramesPool))
177+
;
178+
// ALIAS
179+
daiNodeModule.attr("ColorCamera").attr("Properties") = colorCameraProperties;
180+
181+
}

src/pipeline/node/Common.hpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
#pragma once
2+
3+
// pybind
4+
#include "pybind11_common.hpp"
5+
6+
// Libraries
7+
#include "hedley/hedley.h"
8+
9+
// pybind11
10+
#include "pybind11/stl_bind.h"
11+
12+
#include "depthai/pipeline/Pipeline.hpp"
13+
#include "depthai/pipeline/Node.hpp"
14+
15+
// Map of python node classes and call to pipeline to create it
16+
extern std::vector<std::pair<py::handle, std::function<std::shared_ptr<dai::Node>(dai::Pipeline&, py::object class_)>>> pyNodeCreateMap;
17+
extern py::handle daiNodeModule;
18+
19+
template<typename T, typename DERIVED = dai::Node>
20+
py::class_<T> addNode(const char* name, const char* docstring = nullptr){
21+
auto node = py::class_<T, DERIVED, std::shared_ptr<T>>(daiNodeModule, name, docstring);
22+
pyNodeCreateMap.push_back(std::make_pair(node, [](dai::Pipeline& p, py::object class_){
23+
return p.create<T>();
24+
}));
25+
return node;
26+
}
27+
28+
template<typename T, typename DERIVED = dai::Node>
29+
py::class_<T> addNodeAbstract(const char* name, const char* docstring = nullptr){
30+
auto node = py::class_<T, DERIVED, std::shared_ptr<T>>(daiNodeModule, name, docstring);
31+
pyNodeCreateMap.push_back(std::make_pair(node, [](dai::Pipeline& p, py::object class_) -> std::shared_ptr<dai::Node> {
32+
throw std::invalid_argument(std::string(py::str(class_)) + " is an abstract node. Choose an appropriate derived node instead");
33+
return nullptr;
34+
}));
35+
return node;
36+
}
37+
38+
// Macro helpers
39+
#define ADD_NODE(NodeName) addNode<NodeName>(#NodeName, DOC(dai, node, NodeName))
40+
#define ADD_NODE_DERIVED(NodeName, Derived) addNode<NodeName, Derived>(#NodeName, DOC(dai, node, NodeName))
41+
#define ADD_NODE_ABSTRACT(NodeName) addNodeAbstract<NodeName>(#NodeName, DOC(dai, node, NodeName))
42+
#define ADD_NODE_DERIVED_ABSTRACT(NodeName, Derived) addNodeAbstract<NodeName, Derived>(#NodeName, DOC(dai, node, NodeName))
43+
#define ADD_NODE_DOC(NodeName, docstring) addNode<NodeName>(#NodeName, docstring)
44+
#define ADD_NODE_DERIVED_DOC(NodeName, Derived, docstring) addNode<NodeName, Derived>(#NodeName, docstring)

0 commit comments

Comments
 (0)