diff --git a/src/include/ranges/index_pack.cc.h b/src/include/ranges/index_pack.cc.h new file mode 100644 index 0000000..01e4120 --- /dev/null +++ b/src/include/ranges/index_pack.cc.h @@ -0,0 +1,61 @@ + +#ifndef __cxz_index_pack_cc_h__ +#define __cxz_index_pack_cc_h__ + +#include "index_pack.h" + +namespace CNORXZ +{ + template + constexpr SPack::SPack(const Sptr&... is) : + mIs(is...) + {} + + template + constexpr SPack::SPack(const Tuple...>& is) : + mIs(is) + {} + + template + constexpr const Tuple...>& SPack::all() const + { + return mIs; + } + + template + template + constexpr decltype(auto) SPack::get(std::integral_constant i) const + { + return std::get(mIs); + } + + template + template + constexpr decltype(auto) SPack::operator[](std::integral_constant i) const + { + return get(i); + } + + template + template + constexpr decltype(auto) SPack::rmul(const Sptr& i) const + { + return SPack( std::tuple_cat(mIs,i) ); + } + + template + template + constexpr decltype(auto) SPack::lmul(const Sptr& i) const + { + return SPack( std::tuple_cat(i, mIs) ); + } + + template + template + constexpr decltype(auto) SPack::mul(const SPack& p) const + { + return SPack( std::tuple_cat(mIs, all()) ); + } +} + +#endif diff --git a/src/include/ranges/index_pack.h b/src/include/ranges/index_pack.h new file mode 100644 index 0000000..95115d6 --- /dev/null +++ b/src/include/ranges/index_pack.h @@ -0,0 +1,61 @@ + +#ifndef __cxz_index_pack_h__ +#define __cxz_index_pack_h__ + +#include "base/base.h" +#include "xindex.h" + +namespace CNORXZ +{ + template + class SPack + { + public: + SP_DEFAULT_MEMBERS(constexpr,SPack); + constexpr SPack(const Sptr&... is); + constexpr SPack(const Tuple...>& is); + + constexpr const Tuple...>& all() const; + + constexpr SizeT size() const; + + template + constexpr decltype(auto) get(std::integral_constant i) const; + + template + constexpr decltype(auto) operator[](std::integral_constant i) const; + + template + constexpr decltype(auto) rmul(const Sptr& i) const; + + template + constexpr decltype(auto) lmul(const Sptr& i) const; + + template + constexpr decltype(auto) mul(const SPack& p) const; + + private: + Tuple...> mIs; + }; + + class DPack + { + public: + DEFAULT_MEMBERS(DPack); + DPack(const Vector& is); + DPack(Vector&& is); + + const Vector& all() const; + SizeT size() const; + const XIndexPtr& get(SizeT i) const; + const XIndexPtr& operator[](SizeT i) const; + DPack rmul(const XIndexPtr& i) const; + DPack lmul(const XIndexPtr& i) const; + DPack mul(const DPack& p) const; + + private: + Vector mIs; + }; +} + +#endif diff --git a/src/include/ranges/mrange.h b/src/include/ranges/mrange.h index a54cd9b..4120912 100644 --- a/src/include/ranges/mrange.h +++ b/src/include/ranges/mrange.h @@ -10,7 +10,8 @@ namespace CNORXZ { - + // template + // -> Format + IndexTuple template class GMIndex : public IndexInterface, Tuple > @@ -31,6 +32,8 @@ namespace CNORXZ constexpr GMIndex(const GMIndex& i); constexpr GMIndex& operator=(const GMIndex& i); + //constexpr GMIndex(const SPack& is); + //constexpr GMIndex(const FormatT& format, const SPack& is); constexpr GMIndex(const Indices&... is); constexpr GMIndex(const BlockType& blockSizes, const Indices&... is); constexpr GMIndex(const Sptr&... is); @@ -113,7 +116,7 @@ namespace CNORXZ IndexPack mIPack; typedef RemoveRef{}))> LexBlockType; LexBlockType mLexBlockSizes; - BlockType mBlockSizes; + BlockType mBlockSizes; // -> FormatT SizeT mLex; typedef RemoveRef LMaxT; LMaxT mLMax; diff --git a/src/include/ranges/ranges.cc.h b/src/include/ranges/ranges.cc.h index a72925b..59de5f9 100644 --- a/src/include/ranges/ranges.cc.h +++ b/src/include/ranges/ranges.cc.h @@ -8,3 +8,4 @@ #include "dindex.cc.h" #include "lindex.cc.h" #include "index_mul.cc.h" +#include "index_pack.cc.h" diff --git a/src/include/ranges/ranges.h b/src/include/ranges/ranges.h index d58a141..801ad48 100644 --- a/src/include/ranges/ranges.h +++ b/src/include/ranges/ranges.h @@ -10,5 +10,6 @@ #include "dindex.h" #include "lindex.h" #include "index_mul.h" +#include "index_pack.h" #include "ranges.cc.h" diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 743b83a..0d469b1 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -6,6 +6,7 @@ set(libcnorxz_a_SOURCES ${CMAKE_SOURCE_DIR}/src/lib/ranges/yrange.cc ${CMAKE_SOURCE_DIR}/src/lib/ranges/crange.cc ${CMAKE_SOURCE_DIR}/src/lib/ranges/dindex.cc + ${CMAKE_SOURCE_DIR}/src/lib/ranges/index_pack.cc ) add_library(cnorxz_obj OBJECT diff --git a/src/lib/ranges/index_pack.cc b/src/lib/ranges/index_pack.cc new file mode 100644 index 0000000..9be8479 --- /dev/null +++ b/src/lib/ranges/index_pack.cc @@ -0,0 +1,59 @@ + +#include "ranges/index_pack.h" + +namespace CNORXZ +{ + DPack::DPack(const Vector& is) : + mIs(is) + {} + + DPack::DPack(Vector&& is) : + mIs(std::forward>(is)) + {} + + const Vector& DPack::all() const + { + return mIs; + } + + SizeT DPack::size() const + { + return mIs.size(); + } + + const XIndexPtr& DPack::get(SizeT i) const + { + return mIs[i]; + } + + const XIndexPtr& DPack::operator[](SizeT i) const + { + return get(i); + } + + DPack DPack::rmul(const XIndexPtr& i) const + { + auto o = mIs; + o.push_back(i); + return DPack(std::move(o)); + } + + DPack DPack::lmul(const XIndexPtr& i) const + { + Vector o; + o.reserve(size()+1); + o.push_back(i); + o.insert(o.end(), mIs.begin(), mIs.end()); + return DPack(std::move(o)); + } + + DPack DPack::mul(const DPack& p) const + { + Vector o; + o.reserve(size()+p.size()); + o.insert(o.end(), mIs.begin(), mIs.end()); + o.insert(o.end(), p.all().begin(), p.all().end()); + return DPack(std::move(o)); + } + +}