#ifndef __functional_multi_array__ #define __functional_multi_array__ #include "multi_array_base.h" #include "slice.h" namespace MultiArrayTools { template class FunctionalMultiArray : public MultiArrayBase { public: typedef ContainerRange CRange; typedef MultiArrayBase MAB; typedef typename MultiArrayBase::const_iterator const_iterator; typedef typename CRange::IndexType IndexType; private: mutable T mVal; Function mFunc; public: DEFAULT_MEMBERS(FunctionalMultiArray); FunctionalMultiArray(const std::shared_ptr&... ranges, const Function& func); virtual const T& operator[](const IndexType& i) const override; virtual bool isConst() const override; virtual bool isSlice() const override; // EVALUTAION CLASS ??!!!! auto operator()(std::shared_ptr&... inds) const -> decltype( mkOperation( mFunc, ConstOperationRoot(inds.metaPtr(), inds), ... ) ) }; } // namespace MultiArrayTools /* ========================= * * --- TEMPLATE CODE --- * * ========================= */ namespace MultiArrayTools { /**************************** * FunctionalMultiArray * ****************************/ /* template FunctionalMultiArray::FunctionalMultiArray(const Range& range) : MultiArrayBase(range), mFunc() {} */ template FunctionalMultiArray::FunctionalMultiArray(const std::shared_ptr&... ranges, const Function& func) : MultiArrayBase(ranges...), mFunc(func) {} template const T& FunctionalMultiArray::operator[](const typename CRange::IndexType& i) const { mVal = mFunc(i.meta()); return mVal; } template bool FunctionalMultiArray::isConst() const { return true; } template bool FunctionalMultiArray::isSlice() const { return false; } template auto FunctionalMultiArray:: operator()(std::shared_ptr&... inds) const -> decltype( mkOperation( mFunc, ConstOperationRoot(inds.metaPtr(), inds), ... ) ) { return mkOperation( mFunc, ConstOperationRoot(inds.metaPtr(), inds), ... ); } } // namespace MultiArrayTools #endif