cnorxz/src/include/slice.h

131 lines
3.2 KiB
C
Raw Normal View History

#ifndef __slice_h__
#define __slice_h__
#include "multi_array_base.h"
2018-03-05 18:46:29 +01:00
#include "multi_array_operation.h"
namespace MultiArrayTools
{
template <typename T, class... SRanges>
class Slice : public MutableMultiArrayBase<T,SRanges...>
{
public:
typedef ContainerRange<T,SRanges...> CRange;
typedef MultiArrayBase<T,SRanges...> MAB;
2018-03-05 18:46:29 +01:00
typedef ContainerIndex<T,typename SRanges::IndexType...> IType;
DEFAULT_MEMBERS(Slice);
2018-03-05 18:46:29 +01:00
Slice(T* data, const std::shared_ptr<SRanges>&... ranges);
2018-03-05 00:04:50 +01:00
virtual const T& operator[](const IType& i) const override;
virtual T& operator[](const IType& i) override;
virtual const T& at(const typename IType::MetaType& meta) const override;
virtual T& at(const typename IType::MetaType& meta) override;
virtual const T* data() const override;
virtual T* data() override;
virtual bool isSlice() const override;
2018-03-05 00:04:50 +01:00
virtual auto begin() const -> IType override;
virtual auto end() const -> IType override;
2018-03-05 18:46:29 +01:00
template <class... MARanges>
auto define(const std::shared_ptr<typename SRanges::IType>&... inds)
-> SliceDef<T,OperationRoot<T,MARanges...> >;
private:
T* mData;
};
} // end namespace MultiArrayTools
/* ========================= *
* --- TEMPLATE CODE --- *
* ========================= */
namespace MultiArrayTools
{
/*************
2018-03-05 18:46:29 +01:00
* Slice *
*************/
2018-03-05 18:46:29 +01:00
template <typename T, class... SRanges>
2018-03-05 18:46:29 +01:00
Slice<T,SRanges...>::Slice(T* data, const std::shared_ptr<SRanges>&... ranges) :
MutableMultiArrayBase<T,SRanges...>(ranges...),
mData(data) {}
2018-03-05 00:04:50 +01:00
template <typename T, class... SRanges>
2018-03-05 00:04:50 +01:00
const T& Slice<T,SRanges...>::operator[](const IType& i) const
{
assert(i.sliceMode()); // -> compare objects !!!!!
2018-03-05 00:04:50 +01:00
assert(i.container() == reinterpret_cast<std::intptr_t>(this));
return mData[ i.pos() ];
}
2018-03-05 18:46:29 +01:00
template <typename T, class... SRanges>
2018-03-05 00:04:50 +01:00
T& Slice<T,SRanges...>::operator[](const IType& i)
{
assert(i.sliceMode());
2018-03-05 00:04:50 +01:00
assert(i.container() == reinterpret_cast<std::intptr_t>(this));
return mData[ i.pos() ];
}
2018-03-05 18:46:29 +01:00
template <typename T, class... SRanges>
2018-03-05 00:04:50 +01:00
const T& Slice<T,SRanges...>::at(const typename IType::MetaType& meta) const
{
return mData[ begin().at(meta).pos() ];
}
2018-03-05 18:46:29 +01:00
template <typename T, class... SRanges>
2018-03-05 00:04:50 +01:00
T& Slice<T,SRanges...>::at(const typename IType::MetaType& meta)
{
return mData[ begin().at(meta).pos() ];
}
2018-03-05 18:46:29 +01:00
template <typename T, class... SRanges>
const T* Slice<T,SRanges...>::data() const
{
return mData;
}
template <typename T, class... SRanges>
T* Slice<T,SRanges...>::data()
{
return mData;
}
template <typename T, class... SRanges>
bool Slice<T,SRanges...>::isSlice() const
{
return true;
}
template <typename T, class... SRanges>
2018-03-05 00:04:50 +01:00
auto Slice<T,SRanges...>::begin() const -> Slice<T,SRanges...>::IType
{
2018-03-05 00:04:50 +01:00
IType i = MAB::mProtoI;
i = 0;
//i = mStartPos;
return i.setData(data());
}
template <typename T, class... SRanges>
2018-03-05 00:04:50 +01:00
auto Slice<T,SRanges...>::end() const -> Slice<T,SRanges...>::IType
{
2018-03-05 00:04:50 +01:00
IType i = MAB::mProtoI;
i = i.max(); // CHECK !!!
//i = std::get<sizeof...(SRanges)>(mBlockSizes);
return i.setData(data());
}
} // end namespace MultiArrayTools
#endif