fix compile errors in map range
This commit is contained in:
parent
bcd875f7d2
commit
6597ac6cb0
6 changed files with 80 additions and 29 deletions
|
@ -8,12 +8,12 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <map>
|
#include <map>
|
||||||
|
|
||||||
//#include "base_def.h"
|
#include "mbase_def.h"
|
||||||
#include "ranges/range_base.h"
|
#include "ranges/range_base.h"
|
||||||
#include "ranges/index_base.h"
|
#include "ranges/index_base.h"
|
||||||
|
|
||||||
#include "ranges/rpack_num.h"
|
#include "ranges/rpack_num.h"
|
||||||
#include "ranges/multi_range_factory_product_map.h"
|
#include "map_range_factory_product_map.h"
|
||||||
#include "ranges/x_to_string.h"
|
#include "ranges/x_to_string.h"
|
||||||
#include "ranges/type_map.h"
|
#include "ranges/type_map.h"
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ namespace MultiArrayTools
|
||||||
template <class MA, class... Indices>
|
template <class MA, class... Indices>
|
||||||
auto mkMapOp(const MA& ma,
|
auto mkMapOp(const MA& ma,
|
||||||
const std::tuple<std::shared_ptr<Indices>...>& itp)
|
const std::tuple<std::shared_ptr<Indices>...>& itp)
|
||||||
-> ConstOperation<T,typename Indices::RangeType...>
|
-> ConstOperationRoot<typename MA::value_type,typename Indices::RangeType...>
|
||||||
{
|
{
|
||||||
return PackNum<sizeof...(Indices)-1>::mkMapOp(ma, itp);
|
return PackNum<sizeof...(Indices)-1>::mkMapOp(ma, itp);
|
||||||
}
|
}
|
||||||
|
@ -38,25 +38,25 @@ namespace MultiArrayTools
|
||||||
class OpExpr
|
class OpExpr
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef SingleIndex<MapF::value_type,SpaceType::ANY> OIType;
|
typedef SingleIndex<typename MapF::value_type,SpaceType::ANY> OIType;
|
||||||
typedef MapF::IndexPack IndexPack;
|
typedef typename MapF::IndexPack IndexPack;
|
||||||
static constexpr size_t LAYER = Expr::LAYER + 1;
|
static constexpr size_t LAYER = Expr::LAYER + 1;
|
||||||
static constexpr size_t SIZE = Expr::SIZE;
|
static constexpr size_t SIZE = Expr::SIZE;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
OpExpr() = default;
|
OpExpr() = default;
|
||||||
|
|
||||||
const IndexClass* mIndPtr;
|
const OIType* mIndPtr;
|
||||||
size_t mSPos;
|
size_t mSPos;
|
||||||
size_t mMax;
|
size_t mMax;
|
||||||
Expr mExpr;
|
Expr mExpr;
|
||||||
|
|
||||||
typedef decltype(mOp.rootSteps(iPtrNum).extend( mExpr.rootSteps(iPtrNum) )) ExtType;
|
|
||||||
ExtType mExt;
|
|
||||||
|
|
||||||
typedef decltype(mkMapOp(std::declval<MapF>(), std::declval<IndexPack>())) Op;
|
typedef decltype(mkMapOp(std::declval<MapF>(), std::declval<IndexPack>())) Op;
|
||||||
Op mOp;
|
Op mOp;
|
||||||
|
|
||||||
|
typedef decltype(mOp.rootSteps(std::declval<intptr_t>()).extend( mExpr.rootSteps(std::declval<intptr_t>()) )) ExtType;
|
||||||
|
ExtType mExt;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
OpExpr(const OpExpr& in) = default;
|
OpExpr(const OpExpr& in) = default;
|
||||||
OpExpr(OpExpr&& in) = default;
|
OpExpr(OpExpr&& in) = default;
|
||||||
|
@ -84,7 +84,7 @@ namespace MultiArrayTools
|
||||||
typedef std::tuple<typename Indices::MetaType...> MetaType;
|
typedef std::tuple<typename Indices::MetaType...> MetaType;
|
||||||
typedef MapRange<typename Indices::RangeType...> RangeType;
|
typedef MapRange<typename Indices::RangeType...> RangeType;
|
||||||
typedef MapIndex IType;
|
typedef MapIndex IType;
|
||||||
typedef SingleIndex<MapF::value_type,SpaceType::ANY> OIType;
|
typedef SingleIndex<typename MapF::value_type,SpaceType::ANY> OIType;
|
||||||
|
|
||||||
static constexpr IndexType sType() { return IndexType::MULTI; }
|
static constexpr IndexType sType() { return IndexType::MULTI; }
|
||||||
static constexpr size_t sDim() { return sizeof...(Indices); }
|
static constexpr size_t sDim() { return sizeof...(Indices); }
|
||||||
|
@ -163,7 +163,8 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
template <class Exprs>
|
template <class Exprs>
|
||||||
auto ifor(Exprs exs) const
|
auto ifor(Exprs exs) const
|
||||||
-> decltype(RPackNum<sizeof...(Indices)-1>::mkFor(mIPack, OpExpr( range()->map() , mOutIndex, exs ) ));
|
-> decltype(RPackNum<sizeof...(Indices)-1>::mkFor
|
||||||
|
(mIPack, OpExpr<MapF,Exprs>( range()->map(), mIPack, mOutIndex, exs ) ) );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
template <class Exprs>
|
template <class Exprs>
|
||||||
|
@ -173,7 +174,7 @@ namespace MultiArrayTools
|
||||||
};
|
};
|
||||||
|
|
||||||
template <class MapF, class... Indices>
|
template <class MapF, class... Indices>
|
||||||
auto mapResult<MapIndex<MapF,Indices...> >(const std::shared_ptr<MapIndex<MapF,Indices...> >& ind)
|
auto mapResult/*<MapIndex<MapF,Indices...> >*/(const std::shared_ptr<MapIndex<MapF,Indices...> >& ind)
|
||||||
-> decltype(ind->outIndex())
|
-> decltype(ind->outIndex())
|
||||||
{
|
{
|
||||||
return ind->outIndex();
|
return ind->outIndex();
|
||||||
|
@ -214,8 +215,8 @@ namespace MultiArrayTools
|
||||||
typedef std::tuple<std::shared_ptr<Ranges>...> Space;
|
typedef std::tuple<std::shared_ptr<Ranges>...> Space;
|
||||||
typedef MapIndex<typename Ranges::IndexType...> IndexType;
|
typedef MapIndex<typename Ranges::IndexType...> IndexType;
|
||||||
typedef MapRange RangeType;
|
typedef MapRange RangeType;
|
||||||
typedef SingleRange<MapF::value_type,SpaceType::ANY> ORType;
|
typedef SingleRange<typename MapF::value_type,SpaceType::ANY> ORType;
|
||||||
typedef SingleRangeFactory<MapF::value_type,SpaceType::ANY> ORFType;
|
typedef SingleRangeFactory<typename MapF::value_type,SpaceType::ANY> ORFType;
|
||||||
//typedef typename RangeInterface<MapIndex<typename Ranges::IndexType...> >::IndexType IndexType;
|
//typedef typename RangeInterface<MapIndex<typename Ranges::IndexType...> >::IndexType IndexType;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -228,7 +229,7 @@ namespace MultiArrayTools
|
||||||
|
|
||||||
Space mSpace;
|
Space mSpace;
|
||||||
const MapF& mMapf;
|
const MapF& mMapf;
|
||||||
shred_ptr<ORType> mOutRange;
|
std::shared_ptr<ORType> mOutRange;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
@ -240,7 +241,7 @@ namespace MultiArrayTools
|
||||||
template <size_t N>
|
template <size_t N>
|
||||||
auto getPtr() const -> decltype( std::get<N>( mSpace ) )&;
|
auto getPtr() const -> decltype( std::get<N>( mSpace ) )&;
|
||||||
|
|
||||||
shred_ptr<ORType> outRange() const;
|
std::shared_ptr<ORType> outRange() const;
|
||||||
const MapF& map() const;
|
const MapF& map() const;
|
||||||
|
|
||||||
virtual size_t dim() const final;
|
virtual size_t dim() const final;
|
||||||
|
@ -289,8 +290,8 @@ namespace MultiArrayTools
|
||||||
template <class MapF, class Expr>
|
template <class MapF, class Expr>
|
||||||
OpExpr<MapF,Expr>::OpExpr(const MapF& mapf, const IndexPack& ipack,
|
OpExpr<MapF,Expr>::OpExpr(const MapF& mapf, const IndexPack& ipack,
|
||||||
const std::shared_ptr<OIType> oind, Expr ex) :
|
const std::shared_ptr<OIType> oind, Expr ex) :
|
||||||
mIndPtr(oind.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mExpr(expr),
|
mIndPtr(oind.get()), mSPos(mIndPtr->pos()), mMax(mIndPtr->max()), mExpr(ex),
|
||||||
mExt(expr.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr.get() ))),
|
mExt(ex.rootSteps( reinterpret_cast<std::intptr_t>( mIndPtr.get() ))),
|
||||||
mOp(mapf, ipack)
|
mOp(mapf, ipack)
|
||||||
{
|
{
|
||||||
assert(mIndPtr != nullptr);
|
assert(mIndPtr != nullptr);
|
||||||
|
@ -302,8 +303,8 @@ namespace MultiArrayTools
|
||||||
inline void OpExpr<MapF,Expr>::operator()(size_t mlast,
|
inline void OpExpr<MapF,Expr>::operator()(size_t mlast,
|
||||||
ExtType last) const
|
ExtType last) const
|
||||||
{
|
{
|
||||||
const ExtType npos = last + mExt*pos;
|
|
||||||
constexpr size_t NEXT = Op::SIZE;
|
constexpr size_t NEXT = Op::SIZE;
|
||||||
|
const ExtType npos = last;
|
||||||
const size_t pos = mIndPtr->getMeta( mOp.get( npos ) );
|
const size_t pos = mIndPtr->getMeta( mOp.get( npos ) );
|
||||||
const size_t mnpos = PosForward<ForType::DEFAULT>::value(mlast, mMax, pos);
|
const size_t mnpos = PosForward<ForType::DEFAULT>::value(mlast, mMax, pos);
|
||||||
mExpr(mnpos, Getter<NEXT>::template getX<ExtType>( npos ) );
|
mExpr(mnpos, Getter<NEXT>::template getX<ExtType>( npos ) );
|
||||||
|
@ -313,8 +314,8 @@ namespace MultiArrayTools
|
||||||
inline void OpExpr<MapF,Expr>::operator()(size_t mlast) const
|
inline void OpExpr<MapF,Expr>::operator()(size_t mlast) const
|
||||||
{
|
{
|
||||||
const ExtType last;
|
const ExtType last;
|
||||||
const ExtType npos = last + mExt*pos;
|
|
||||||
constexpr size_t NEXT = Op::SIZE;
|
constexpr size_t NEXT = Op::SIZE;
|
||||||
|
const ExtType npos = last;
|
||||||
const size_t pos = mIndPtr->at( mOp.get( npos ) ).pos();
|
const size_t pos = mIndPtr->at( mOp.get( npos ) ).pos();
|
||||||
const size_t mnpos = PosForward<ForType::DEFAULT>::value(mlast, mMax, pos);
|
const size_t mnpos = PosForward<ForType::DEFAULT>::value(mlast, mMax, pos);
|
||||||
mExpr(mnpos, Getter<NEXT>::template getX<ExtType>( npos ));
|
mExpr(mnpos, Getter<NEXT>::template getX<ExtType>( npos ));
|
||||||
|
@ -363,7 +364,7 @@ namespace MultiArrayTools
|
||||||
IB::mPos = RPackNum<sizeof...(Indices)-1>::makePos(mIPack);
|
IB::mPos = RPackNum<sizeof...(Indices)-1>::makePos(mIPack);
|
||||||
std::get<sizeof...(Indices)>(mBlockSizes) = 1;
|
std::get<sizeof...(Indices)>(mBlockSizes) = 1;
|
||||||
RPackNum<sizeof...(Indices)-1>::initBlockSizes(mBlockSizes, mIPack); // has one more element!
|
RPackNum<sizeof...(Indices)-1>::initBlockSizes(mBlockSizes, mIPack); // has one more element!
|
||||||
mOutIndex = std::dynamic_pointer_cast<ORType>( IB::mRangePtr )->outRange()->begin();
|
mOutIndex = std::dynamic_pointer_cast<OIType>( IB::mRangePtr )->outRange()->begin();
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class MapF, class... Indices>
|
template <class MapF, class... Indices>
|
||||||
|
@ -401,7 +402,7 @@ namespace MultiArrayTools
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class MapF, class... Indices>
|
template <class MapF, class... Indices>
|
||||||
std::shared_ptr<OIType> MapIndex<MapF,Indices...>::outIndex() const
|
auto MapIndex<MapF,Indices...>::outIndex() const -> std::shared_ptr<OIType>
|
||||||
{
|
{
|
||||||
return mOutIndex;
|
return mOutIndex;
|
||||||
}
|
}
|
||||||
|
@ -546,9 +547,10 @@ namespace MultiArrayTools
|
||||||
template <class Exprs>
|
template <class Exprs>
|
||||||
auto MapIndex<MapF,Indices...>::ifor(Exprs exs) const
|
auto MapIndex<MapF,Indices...>::ifor(Exprs exs) const
|
||||||
-> decltype(RPackNum<sizeof...(Indices)-1>::mkFor
|
-> decltype(RPackNum<sizeof...(Indices)-1>::mkFor
|
||||||
(mIPack, OpExpr( range()->map(), mIPack, mOutIndex, exs ) ) )
|
(mIPack, OpExpr<MapF,Exprs>( range()->map(), mIPack, mOutIndex, exs ) ) )
|
||||||
{
|
{
|
||||||
return RPackNum<sizeof...(Indices)-1>::mkFor(mIPack, OpExpr( range()->map(), mIPack, mOutIndex, exs ) );
|
return RPackNum<sizeof...(Indices)-1>::mkFor
|
||||||
|
(mIPack, OpExpr<MapF,Exprs>( range()->map(), mIPack, mOutIndex, exs ) );
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
template <class MapF, class... Indices>
|
template <class MapF, class... Indices>
|
||||||
|
@ -600,6 +602,8 @@ namespace MultiArrayTools
|
||||||
if(not check){
|
if(not check){
|
||||||
std::vector<std::intptr_t> pv(sizeof...(Ranges));
|
std::vector<std::intptr_t> pv(sizeof...(Ranges));
|
||||||
RPackNum<sizeof...(Ranges)-1>::RangesToVec(ptp, pv);
|
RPackNum<sizeof...(Ranges)-1>::RangesToVec(ptp, pv);
|
||||||
|
pv.push_back( reinterpret_cast<std::intptr_t>
|
||||||
|
( &std::dynamic_pointer_cast<oType>( mProd ).mMapf ) );
|
||||||
MapRangeFactoryProductMap::mAleadyCreated[mProd] = pv;
|
MapRangeFactoryProductMap::mAleadyCreated[mProd] = pv;
|
||||||
out = mProd;
|
out = mProd;
|
||||||
}
|
}
|
||||||
|
@ -615,7 +619,7 @@ namespace MultiArrayTools
|
||||||
mSpace(std::make_tuple(rs...)),
|
mSpace(std::make_tuple(rs...)),
|
||||||
mMapf(mapf)
|
mMapf(mapf)
|
||||||
{
|
{
|
||||||
std::vector<MapF::value_type> outmeta;
|
std::vector<typename MapF::value_type> outmeta;
|
||||||
// set !!!!
|
// set !!!!
|
||||||
ORFType orf(outmeta);
|
ORFType orf(outmeta);
|
||||||
mOutRange = std::dynamic_pointer_cast<ORType>( orf.create() );
|
mOutRange = std::dynamic_pointer_cast<ORType>( orf.create() );
|
||||||
|
@ -626,7 +630,7 @@ namespace MultiArrayTools
|
||||||
mSpace( space ),
|
mSpace( space ),
|
||||||
mMapf(mapf)
|
mMapf(mapf)
|
||||||
{
|
{
|
||||||
std::vector<MapF::value_type> outmeta;
|
std::vector<typename MapF::value_type> outmeta;
|
||||||
// set !!!!
|
// set !!!!
|
||||||
ORFType orf(outmeta);
|
ORFType orf(outmeta);
|
||||||
mOutRange = std::dynamic_pointer_cast<ORType>( orf.create() );
|
mOutRange = std::dynamic_pointer_cast<ORType>( orf.create() );
|
||||||
|
@ -647,13 +651,13 @@ namespace MultiArrayTools
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class MapF, class... Ranges>
|
template <class MapF, class... Ranges>
|
||||||
shred_ptr<ORType> MapRange<MapF,Ranges...>::outRange() const
|
auto MapRange<MapF,Ranges...>::outRange() const -> std::shared_ptr<ORType>
|
||||||
{
|
{
|
||||||
return mOutRange;
|
return mOutRange;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class MapF, class... Ranges>
|
template <class MapF, class... Ranges>
|
||||||
const MapF& map() const
|
const MapF& MapRange<MapF,Ranges...>::map() const
|
||||||
{
|
{
|
||||||
return mMapf;
|
return mMapf;
|
||||||
}
|
}
|
||||||
|
|
26
src/include/map_range_factory_product_map.h
Normal file
26
src/include/map_range_factory_product_map.h
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
|
||||||
|
#ifndef __map_range_factory_product_map_h__
|
||||||
|
#define __map_range_factory_product_map_h__
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
#include "ranges/rbase_def.h"
|
||||||
|
#include "mbase_def.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
class MapRangeFactoryProductMap
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
template <class MapF, class... Ranges>
|
||||||
|
friend class MapRangeFactory;
|
||||||
|
|
||||||
|
private:
|
||||||
|
static std::map<std::shared_ptr<RangeBase>,std::vector<std::intptr_t> > mAleadyCreated;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -66,6 +66,18 @@ namespace MultiArrayTools
|
||||||
// slice.h
|
// slice.h
|
||||||
template <typename T, class... SRanges>
|
template <typename T, class... SRanges>
|
||||||
class SliceDef;
|
class SliceDef;
|
||||||
|
|
||||||
|
// map_range.h
|
||||||
|
template <class MapF, class... Indices>
|
||||||
|
class MapIndex;
|
||||||
|
|
||||||
|
// map_range.h
|
||||||
|
template <class MapF, class... Ranges>
|
||||||
|
class MapRangeFactory;
|
||||||
|
|
||||||
|
// map_range.h
|
||||||
|
template <class MapF, class... Ranges>
|
||||||
|
class MapRange;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "functional_multi_array.h"
|
#include "functional_multi_array.h"
|
||||||
#include "helper_tools.h"
|
#include "helper_tools.h"
|
||||||
#include "operation_def.h"
|
#include "operation_def.h"
|
||||||
|
#include "map_range.h"
|
||||||
//#include "slice.h"
|
//#include "slice.h"
|
||||||
//#include "manipulator.h"
|
//#include "manipulator.h"
|
||||||
//#include "range_transformer.h"
|
//#include "range_transformer.h"
|
||||||
|
|
|
@ -3,6 +3,7 @@ set(libmultiarray_a_SOURCES
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/ranges/range_base.cc
|
${CMAKE_SOURCE_DIR}/src/lib/ranges/range_base.cc
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/ranges/anonymous_range.cc
|
${CMAKE_SOURCE_DIR}/src/lib/ranges/anonymous_range.cc
|
||||||
${CMAKE_SOURCE_DIR}/src/lib/ranges/multi_range_factory_product_map.cc
|
${CMAKE_SOURCE_DIR}/src/lib/ranges/multi_range_factory_product_map.cc
|
||||||
|
${CMAKE_SOURCE_DIR}/src/lib/map_range_factory_product_map.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
file(GLOB cc_files "${CMAKE_SOURCE_DIR}/src/lib/ranges/range_types/*.cc")
|
file(GLOB cc_files "${CMAKE_SOURCE_DIR}/src/lib/ranges/range_types/*.cc")
|
||||||
|
|
7
src/lib/map_range_factory_product_map.cc
Normal file
7
src/lib/map_range_factory_product_map.cc
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
|
||||||
|
#include "map_range_factory_product_map.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
std::map<std::shared_ptr<RangeBase>,std::vector<std::intptr_t> > MapRangeFactoryProductMap::mAleadyCreated;
|
||||||
|
}
|
Loading…
Reference in a new issue