obj_handle: get function + RArray
This commit is contained in:
parent
066e267753
commit
e5782ac327
4 changed files with 241 additions and 3 deletions
|
@ -69,6 +69,18 @@ namespace CNORXZ
|
||||||
return &*mC;
|
return &*mC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T* ObjHandle<T>::get()
|
||||||
|
{
|
||||||
|
return &*mC;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
const T* ObjHandle<T>::get() const
|
||||||
|
{
|
||||||
|
return &*mC;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -77,6 +77,12 @@ namespace CNORXZ
|
||||||
|
|
||||||
/** get pointer to data (const) */
|
/** get pointer to data (const) */
|
||||||
const T* operator->() const;
|
const T* operator->() const;
|
||||||
|
|
||||||
|
/** get object. */
|
||||||
|
T* get();
|
||||||
|
|
||||||
|
/** get object. */
|
||||||
|
const T* get() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,10 @@ namespace CNORXZ
|
||||||
namespace mpi
|
namespace mpi
|
||||||
{
|
{
|
||||||
|
|
||||||
|
/*===============+
|
||||||
|
| RCArray |
|
||||||
|
+===============*/
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
RCArray<T>::RCArray(const RCArray& a) :
|
RCArray<T>::RCArray(const RCArray& a) :
|
||||||
mA(a.mA->copy()),
|
mA(a.mA->copy()),
|
||||||
|
@ -43,6 +47,14 @@ namespace CNORXZ
|
||||||
mGlobal(RRangeFactory(rangeCast<YRange>(a.range()),rangeCast<YRange>(mGeom)).create())
|
mGlobal(RRangeFactory(rangeCast<YRange>(a.range()),rangeCast<YRange>(mGeom)).create())
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <class IndexI, class IndexK>
|
||||||
|
RCArray<T>::RCArray(const RRange<IndexI,IndexK>& range) :
|
||||||
|
mA(std::make_unique<T>(range->local())),
|
||||||
|
mGeom(range->geom()),
|
||||||
|
mGlobal(range)
|
||||||
|
{}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
template <typename I, typename M>
|
template <typename I, typename M>
|
||||||
T RCArray<T>::operator[](const IndexInterface<I,M>& i) const
|
T RCArray<T>::operator[](const IndexInterface<I,M>& i) const
|
||||||
|
@ -241,11 +253,146 @@ namespace CNORXZ
|
||||||
Sptr<Vector<SizeT>> RCArray<T>::load(const Sptr<Index>& i, const F& f) const
|
Sptr<Vector<SizeT>> RCArray<T>::load(const Sptr<Index>& i, const F& f) const
|
||||||
{
|
{
|
||||||
Sptr<Vector<SizeT>> imap = std::make_shared<Vector<SizeT>>();
|
Sptr<Vector<SizeT>> imap = std::make_shared<Vector<SizeT>>();
|
||||||
|
CXZ_ERROR("!!!");
|
||||||
//load(i, /**/, imap);
|
//load(i, /**/, imap);
|
||||||
return imap;
|
return imap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*===============+
|
||||||
|
| RCArray |
|
||||||
|
+===============*/
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
RArray<T>::RArray(const RArray& a) :
|
||||||
|
RCArray<T>(a),
|
||||||
|
mB(dynamic_cast<ArrayBase<T>*>(RCA::mA.get()))
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
RArray<T>& RArray<T>::operator=(const RArray& a)
|
||||||
|
{
|
||||||
|
RCArray<T>::operator=(a);
|
||||||
|
mB = dynamic_cast<ArrayBase<T>*>(RCA::mA.get());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <class IndexI, class IndexK>
|
||||||
|
RArray<T>::RArray(const RRange<IndexI,IndexK>& range) :
|
||||||
|
RCArray<T>(range),
|
||||||
|
mB(dynamic_cast<ArrayBase<T>*>(RCA::mA.get()))
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
RArray<T>::RArray(const ArrayBase<T>& a, const RangePtr& geom) :
|
||||||
|
RCArray<T>(a, geom),
|
||||||
|
mB(dynamic_cast<ArrayBase<T>*>(RCA::mA.get()))
|
||||||
|
{}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <typename I, typename M>
|
||||||
|
RArray<T>& RArray<T>::set(const IndexInterface<I,M>& i, const T& val)
|
||||||
|
{
|
||||||
|
auto it = begin() + i.lex();
|
||||||
|
it.set(val);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <class... Indices>
|
||||||
|
RArray<T>& RArray<T>::set(const SPack<Indices...>& pack, const T& val)
|
||||||
|
{
|
||||||
|
auto it = begin() + pack.lex();
|
||||||
|
it.set(val);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
RArray<T>& RArray<T>::set(const DPack& pack, const T& val)
|
||||||
|
{
|
||||||
|
auto it = begin() + pack.lex();
|
||||||
|
it.set(val);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <typename I, typename M>
|
||||||
|
Sptr<ArrayBase<T>> RArray<T>::sl(const IndexInterface<I,M>& begin,
|
||||||
|
const IndexInterface<I,M>& end)
|
||||||
|
{
|
||||||
|
if constexpr(is_rank_index<I>::value){
|
||||||
|
CXZ_ERROR("not implemented");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return mB->sl(begin, end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <class Index>
|
||||||
|
OpRoot<T,Index> RArray<T>::operator()(const Sptr<Index>& i)
|
||||||
|
{
|
||||||
|
CXZ_ERROR("not implemented");
|
||||||
|
return OpRoot<T,Index>();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
template <class... Indices>
|
||||||
|
inline decltype(auto) RArray<T>::operator()(const SPack<Indices...>& pack)
|
||||||
|
{
|
||||||
|
typedef typename std::remove_reference<decltype(*pack[CSizeT<0>{}])>::type I0;
|
||||||
|
if constexpr(is_rank_index<I0>::value){
|
||||||
|
// preliminary:
|
||||||
|
CXZ_ASSERT(this->formatIsTrivial(),
|
||||||
|
"array has non-trivial format, rank operations require trivial format");
|
||||||
|
auto ri = pack[CSizeT<0>{}];
|
||||||
|
auto li = iter<1,sizeof...(Indices)>
|
||||||
|
( [&](auto i) { return pack[CSizeT<i>{}]; },
|
||||||
|
[](const auto&... x) { return mindexPtr( (x * ...) ); } );
|
||||||
|
return croproot(*this, ri, li);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return (*mB)(pack);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
inline decltype(auto) RArray<T>::operator()(const DPack& pack)
|
||||||
|
{
|
||||||
|
// TODO: assert that none of the indices is rank index
|
||||||
|
return (*mB)(pack);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
T* RArray<T>::data()
|
||||||
|
{
|
||||||
|
return mB->data();
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
typename RArray<T>::iterator RArray<T>::begin()
|
||||||
|
{
|
||||||
|
return iterator(mB->data(), RCA::mGlobal);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
typename RArray<T>::iterator RArray<T>::end()
|
||||||
|
{
|
||||||
|
return iterator(mB->data(), RCA::mGlobal, RCA::mGlobal->size());
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
ArrayBase<T>& RArray<T>::local()
|
||||||
|
{
|
||||||
|
return *mB;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*============================+
|
||||||
|
| non-member functions |
|
||||||
|
+============================*/
|
||||||
|
|
||||||
template <class TarI, class RTarI, class SrcI, class RSrcI, typename T>
|
template <class TarI, class RTarI, class SrcI, class RSrcI, typename T>
|
||||||
void setupBuffer(const Sptr<RIndex<TarI,RTarI>>& rgi, const Sptr<RIndex<SrcI,RSrcI>>& rgj,
|
void setupBuffer(const Sptr<RIndex<TarI,RTarI>>& rgi, const Sptr<RIndex<SrcI,RSrcI>>& rgj,
|
||||||
const Sptr<Vector<SizeT>>& imap, const CArrayBase<T>& data,
|
const Sptr<Vector<SizeT>>& imap, const CArrayBase<T>& data,
|
||||||
|
|
|
@ -34,6 +34,12 @@ namespace CNORXZ
|
||||||
RCArray(const RCArray& a);
|
RCArray(const RCArray& a);
|
||||||
RCArray& operator=(const RCArray& a);
|
RCArray& operator=(const RCArray& a);
|
||||||
|
|
||||||
|
/** Construct from a rank range.
|
||||||
|
@param range The range.
|
||||||
|
*/
|
||||||
|
template <class IndexI, class IndexK>
|
||||||
|
RCArray(const RRange<IndexI,IndexK>& range);
|
||||||
|
|
||||||
/** Construct from local array object.
|
/** Construct from local array object.
|
||||||
@param a Local array.
|
@param a Local array.
|
||||||
@param geom Rank geometry.
|
@param geom Rank geometry.
|
||||||
|
@ -153,6 +159,8 @@ namespace CNORXZ
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
typedef RCArray<T> RCA;
|
typedef RCArray<T> RCA;
|
||||||
|
typedef typename RCA::const_iterator const_iterator;
|
||||||
|
typedef RBIndex<T> iterator;
|
||||||
|
|
||||||
using RCA::operator[];
|
using RCA::operator[];
|
||||||
using RCA::operator();
|
using RCA::operator();
|
||||||
|
@ -164,8 +172,73 @@ namespace CNORXZ
|
||||||
using RCA::cend;
|
using RCA::cend;
|
||||||
using RCA::sl;
|
using RCA::sl;
|
||||||
|
|
||||||
DEFAULT_MEMBERS(RArray);
|
DEFAULT_C(RArray);
|
||||||
|
DEFAULT_MOVE(RArray);
|
||||||
|
RArray(const RArray& a);
|
||||||
|
RArray& operator=(const RArray& a);
|
||||||
|
|
||||||
|
/** Construct from a rank range.
|
||||||
|
@param range The range.
|
||||||
|
*/
|
||||||
|
template <class IndexI, class IndexK>
|
||||||
|
RArray(const RRange<IndexI,IndexK>& range);
|
||||||
|
|
||||||
|
/** Construct from local array object.
|
||||||
|
@param a Local array.
|
||||||
|
@param geom Rank geometry.
|
||||||
|
*/
|
||||||
|
RArray(const ArrayBase<T>& a, const RangePtr& geom);
|
||||||
|
|
||||||
|
/** Assign value at a position indicated by an index.
|
||||||
|
@param i Index indicating the position.
|
||||||
|
@param val Value.
|
||||||
|
*/
|
||||||
|
template <typename I, typename M>
|
||||||
|
RArray& set(const IndexInterface<I,M>& i, const T& val);
|
||||||
|
|
||||||
|
/** Assign value at a position indicated by an index pack.
|
||||||
|
@param pack Index pack indicating the position.
|
||||||
|
@param val Value.
|
||||||
|
*/
|
||||||
|
template <class... Indices>
|
||||||
|
RArray& set(const SPack<Indices...>& pack, const T& val);
|
||||||
|
|
||||||
|
/** Assign value at a position indicated by an index pack.
|
||||||
|
@param pack Index pack indicating the position.
|
||||||
|
@param val Value.
|
||||||
|
*/
|
||||||
|
RArray& set(const DPack& pack, const T& val);
|
||||||
|
|
||||||
|
/** @copydoc ArrayBase::sl() */
|
||||||
|
template <typename I, typename M>
|
||||||
|
Sptr<ArrayBase<T>> sl(const IndexInterface<I,M>& begin,
|
||||||
|
const IndexInterface<I,M>& end);
|
||||||
|
|
||||||
|
/** @copydoc ArrayBase::operator() */
|
||||||
|
template <class Index>
|
||||||
|
OpRoot<T,Index> operator()(const Sptr<Index>& i);
|
||||||
|
|
||||||
|
/** @copydoc ArrayBase::operator() */
|
||||||
|
template <class... Indices>
|
||||||
|
inline decltype(auto) operator()(const SPack<Indices...>& pack);
|
||||||
|
|
||||||
|
/** @copydoc ArrayBase::operator() */
|
||||||
|
inline decltype(auto) operator()(const DPack& pack);
|
||||||
|
|
||||||
|
/** @copydoc ArrayBase::data() */
|
||||||
|
T* data();
|
||||||
|
|
||||||
|
/** @copydoc ArrayBase::begin() */
|
||||||
|
iterator begin();
|
||||||
|
|
||||||
|
/** @copydoc ArrayBase::end() */
|
||||||
|
iterator end();
|
||||||
|
|
||||||
|
/** Get local array object. */
|
||||||
|
ArrayBase<T>& local();
|
||||||
|
|
||||||
|
private:
|
||||||
|
ArrayBase<T>* mB = nullptr;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue