namespace coco
{
-template <> Load *OpManager::create<Load>(void)
-{
- auto op = make_unique<Load>();
- modulize(op.get());
- return take(std::move(op));
-}
-
-template <> Conv2D *OpManager::create<Conv2D>(void)
-{
- auto op = make_unique<Conv2D>();
- modulize(op.get());
- return take(std::move(op));
-}
-
-template <> MaxPool2D *OpManager::create<MaxPool2D>(void)
-{
- auto op = make_unique<MaxPool2D>();
- modulize(op.get());
- return take(std::move(op));
-}
-
-template <> AvgPool2D *OpManager::create<AvgPool2D>(void)
-{
- auto op = make_unique<AvgPool2D>();
- modulize(op.get());
- return take(std::move(op));
-}
-
-template <> ReLU *OpManager::create<ReLU>(void)
-{
- auto op = make_unique<ReLU>();
- modulize(op.get());
- return take(std::move(op));
-}
-
-template <> PadF *OpManager::create<PadF>(void)
-{
- auto op = make_unique<PadF>();
- modulize(op.get());
- return take(std::move(op));
-}
+//
+// Each Op class SHOULD be default constructible
+//
+#define OP(Name) \
+ template <> Name *OpManager::create<Name>(void) \
+ { \
+ auto op = make_unique<Name>(); \
+ modulize(op.get()); \
+ return take(std::move(op)); \
+ }
+#include "coco/IR/Op.lst"
+#undef OP
void OpManager::destroy(Op *op)
{