diff --git a/src/block/block.h b/src/block/block.h index 74e568f..be046d8 100644 --- a/src/block/block.h +++ b/src/block/block.h @@ -18,8 +18,10 @@ namespace MultiArrayHelper class BlockBinaryOp { public: - BlockBinaryOp() = default; - BlockResult operator()(const BlockClass1& arg1, const BlockClass2& arg2); + BlockBinaryOp(BlockResult& mRes); + void operator()(const BlockClass1& arg1, const BlockClass2& arg2); + private: + BlockResult& mRes; }; template @@ -179,18 +181,18 @@ namespace MultiArrayHelper *********************/ template - BlockResult - BlockBinaryOp::operator()(const BlockClass1& arg1, - const BlockClass2& arg2) + BlockBinaryOp::BlockBinaryOp(BlockResult& res) : mRes(res) {} + + template + void BlockBinaryOp::operator()(const BlockClass1& arg1, + const BlockClass2& arg2) { static OpFunc f; - BlockResult res(arg1.size()); - assert(res.init() and arg1.init() and arg2.init()); + assert(mRes.init() and arg1.init() and arg2.init()); assert(arg1.size() == arg2.size()); for(size_t i = 0; i != arg1.size(); ++i){ - res[i] = f(arg1[i], arg2[i]); + mRes[i] = f(arg1[i], arg2[i]); } - return res; } template diff --git a/src/multi_array_operation.h b/src/multi_array_operation.h index 4dce8f6..bf30109 100644 --- a/src/multi_array_operation.h +++ b/src/multi_array_operation.h @@ -472,7 +472,7 @@ namespace MultiArrayTools template const BlockResult& Operation::get() const { - mRes = std::move( PackNum::template unpackArgs(mOps) ); + PackNum::template unpackArgs(mRes, mOps); return mRes; } diff --git a/src/pack_num.h b/src/pack_num.h index d6978cf..0a3e677 100644 --- a/src/pack_num.h +++ b/src/pack_num.h @@ -28,9 +28,9 @@ namespace MultiArrayHelper } template - static BlockResult unpackArgs(const ArgTuple& tp, const Args&... args) + static void unpackArgs(BlockResult& res, const ArgTuple& tp, const Args&... args) { - return PackNum::template unpackArgs(tp, std::get(tp).get(), args...); + PackNum::template unpackArgs(res, tp, std::get(tp).get(), args...); } template @@ -46,12 +46,12 @@ namespace MultiArrayHelper { template - static BlockResult unpackArgs(const ArgTuple& tp, const Args&... args) + static void unpackArgs(BlockResult& res, const ArgTuple& tp, const Args&... args) { static_assert(sizeof...(Args) == std::tuple_size::value-1, "inconsistent number of arguments"); - static BlockBinaryOp(tp).get()), decltype(args)...> f; - return f(std::get<0>(tp).get(), args...); + BlockBinaryOp(tp).get()), decltype(args)...> f(res); + f(std::get<0>(tp).get(), args...); } template