reorganize headers
This commit is contained in:
parent
0cf90292c3
commit
45bc1686c9
9 changed files with 549 additions and 410 deletions
68
src/base_def.h
Normal file
68
src/base_def.h
Normal file
|
@ -0,0 +1,68 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
#ifndef __base_def_h__
|
||||||
|
#define __base_def_h__
|
||||||
|
|
||||||
|
#define DEFAULT_MEMBERS(__class_name__) __class_name__() = default; \
|
||||||
|
__class_name__(const __class_name__& in) = default; \
|
||||||
|
__class_name__& operator=(const __class_name__& in) = default; \
|
||||||
|
__class_name__(__class_name__&& in) = default; \
|
||||||
|
__class_name__& operator=(__class_name__&& in) = default
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
/***********************
|
||||||
|
* Provided Types *
|
||||||
|
***********************/
|
||||||
|
|
||||||
|
// range_base.h
|
||||||
|
enum class RangeType;
|
||||||
|
|
||||||
|
// range_base.h
|
||||||
|
class MultiRangeType;
|
||||||
|
|
||||||
|
// range_base.h
|
||||||
|
template <class Index>
|
||||||
|
class RangeBase;
|
||||||
|
|
||||||
|
// range_base.h
|
||||||
|
template <class Index>
|
||||||
|
class SubRangeBase;
|
||||||
|
|
||||||
|
// index_base.h
|
||||||
|
class IndefinitIndexBase;
|
||||||
|
|
||||||
|
// index_base.h
|
||||||
|
template <class Index>
|
||||||
|
class IndexBase;
|
||||||
|
|
||||||
|
// single_range.h
|
||||||
|
template <typename U, RangeType TYPE>
|
||||||
|
class SingleIndex;
|
||||||
|
|
||||||
|
// single_range.h
|
||||||
|
template <typename U, RangeType TYPE>
|
||||||
|
class SingleRange;
|
||||||
|
|
||||||
|
// multi_range.h
|
||||||
|
template <class... Indices>
|
||||||
|
class MultiIndex;
|
||||||
|
|
||||||
|
// multi_range.h
|
||||||
|
template <class... Ranges>
|
||||||
|
class MultiRange;
|
||||||
|
|
||||||
|
// multi_array.h
|
||||||
|
template <typename T, class Range>
|
||||||
|
class MultiArray;
|
||||||
|
|
||||||
|
// multi_array_operation.h
|
||||||
|
template <typename T, class Range>
|
||||||
|
class MultiArrayOperationBase;
|
||||||
|
|
||||||
|
// multi_array_operation.h
|
||||||
|
template <typename T, class Range, class Operation, class... Ranges>
|
||||||
|
class MultiArrayOperation;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
87
src/index_base.h
Normal file
87
src/index_base.h
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
#ifndef __index_base_h__
|
||||||
|
#define __index_base_h__
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "base_def.h"
|
||||||
|
#include "range_base.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
|
||||||
|
class IndefinitIndexBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual IndefinitIndexBase& operator=(const IndefinitIndexBase& in) = 0;
|
||||||
|
|
||||||
|
virtual IndefinitIndexBase& operator=(size_t pos) = 0;
|
||||||
|
virtual IndefinitIndexBase& operator++() = 0;
|
||||||
|
virtual IndefinitIndexBase& operator--() = 0;
|
||||||
|
virtual IndefinitIndexBase& operator+=(int n) = 0;
|
||||||
|
virtual IndefinitIndexBase& operator-=(int n) = 0;
|
||||||
|
|
||||||
|
virtual bool operator==(const IndefinitIndexBase& i) = 0;
|
||||||
|
virtual bool operator!=(const IndefinitIndexBase& i) = 0;
|
||||||
|
|
||||||
|
virtual size_t dim() const = 0;
|
||||||
|
virtual size_t pos() const = 0; // = mPos; implement !!!
|
||||||
|
|
||||||
|
std::string& name();
|
||||||
|
const std::string& name() const;
|
||||||
|
|
||||||
|
MultiRangeType rangeType() const = 0;
|
||||||
|
|
||||||
|
virtual bool link(IndefinitIndexBase* toLink);
|
||||||
|
virtual void freeLinked();
|
||||||
|
virtual bool linked() const;
|
||||||
|
virtual void linkTo(IndefinitIndexBase* target) = 0;
|
||||||
|
|
||||||
|
virtual void setPos(size_t pos);
|
||||||
|
|
||||||
|
virtual size_t max() const;
|
||||||
|
virtual size_t outOfRange() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
DEFAULT_MEMBERS(IndefinitIndexBase);
|
||||||
|
|
||||||
|
std::string mName;
|
||||||
|
size_t mPos;
|
||||||
|
|
||||||
|
IndefinitIndexBase* mLinked;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Index>
|
||||||
|
class IndexBase : public IndefinitIndexBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual Index& operator=(const Index& in) override;
|
||||||
|
|
||||||
|
virtual Index& operator=(size_t pos) override;
|
||||||
|
virtual Index& operator++() override;
|
||||||
|
virtual Index& operator--() override;
|
||||||
|
virtual Index& operator+=(int n) override;
|
||||||
|
virtual Index& operator-=(int n) override;
|
||||||
|
|
||||||
|
virtual bool operator==(const IndexBase& i) override;
|
||||||
|
virtual bool operator!=(const IndexBase& i) override;
|
||||||
|
|
||||||
|
virtual size_t pos() const override; // = mPos; implement !!!
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
DEFAULT_MEMBERS(IndexBase);
|
||||||
|
|
||||||
|
// translate index into position
|
||||||
|
virtual size_t evaluate(const Index& in) const = 0;
|
||||||
|
RangeBase<Index>* mRange;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "index_base.cc"
|
||||||
|
|
||||||
|
#endif
|
410
src/me.h
410
src/me.h
|
@ -1,410 +0,0 @@
|
||||||
// -*- C++ -*-
|
|
||||||
|
|
||||||
#ifndef __me_h__
|
|
||||||
#define __me_h__
|
|
||||||
|
|
||||||
#include <cstdlib>
|
|
||||||
#include <vector>
|
|
||||||
#include <string>
|
|
||||||
#include <map>
|
|
||||||
|
|
||||||
#define DEFAULT_MEMBERS(__class_name__) __class_name__() = default; \
|
|
||||||
__class_name__(const __class_name__& in) = default; \
|
|
||||||
__class_name__& operator=(const __class_name__& in) = default; \
|
|
||||||
__class_name__(__class_name__&& in) = default; \
|
|
||||||
__class_name__& operator=(__class_name__&& in) = default
|
|
||||||
|
|
||||||
namespace ME
|
|
||||||
{
|
|
||||||
|
|
||||||
template <class Tuple, size_t N>
|
|
||||||
auto make_left_x(const Tuple& tp) -> decltype(std::tuple_cat(make_left<Tuple,N-1>(tp),
|
|
||||||
std::make_tuple(get<N>(tp))))
|
|
||||||
{
|
|
||||||
return std::tuple_cat(make_left<Tuple,N-1>(tp), std::make_tuple(get<N>(tp)));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Tuple>
|
|
||||||
auto make_left_x<Tuple, 0>(const Tuple& tp) -> decltype(std::make_tuple(get<N>(tp)))
|
|
||||||
{
|
|
||||||
return std::make_tuple(get<N>(tp));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Tuple, size_t N>
|
|
||||||
auto make_right_x(const Tuple& tp) -> decltype(std::tuple_cat(std::make_tuple(get<std::tuple_size(tp)-N>(tp)),
|
|
||||||
make_left<Tuple,std::tuple_size(tp)-N+1>(tp)))
|
|
||||||
{
|
|
||||||
const size_t M = std::tuple_size(tp) - N;
|
|
||||||
return std::tuple_cat(std::make_tuple(get<M>(tp)), make_left<Tuple,M+1>(tp));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Tuple>
|
|
||||||
auto make_right_x<Tuple, 0>(const Tuple& tp) -> decltype(std::make_tuple(get<std::tuple_size(tp)>(tp)))
|
|
||||||
{
|
|
||||||
const size_t M = std::tuple_size(tp);
|
|
||||||
return std::make_tuple(get<M>(tp));
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Tuple, size_t N>
|
|
||||||
auto make_left(const Tuple& tp) -> decltype(make_left_x<Tuple, N>(tp))
|
|
||||||
{
|
|
||||||
return make_left_x<Tuple, N>(tp);
|
|
||||||
}
|
|
||||||
|
|
||||||
template <class Tuple, size_t N>
|
|
||||||
auto make_right(const Tuple& tp) -> decltype(make_right_x<Tuple, std::tuple_size(Tuple)-N>(tp))
|
|
||||||
{
|
|
||||||
return make_right_x<Tuple, std::tuple_size(Tuple)-N>(tp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************/
|
|
||||||
|
|
||||||
/******************
|
|
||||||
* Range *
|
|
||||||
******************/
|
|
||||||
|
|
||||||
enum class RangeType
|
|
||||||
{
|
|
||||||
NIL = 0,
|
|
||||||
SPACE = 1,
|
|
||||||
MOMENTUM = 2,
|
|
||||||
LORENTZ = 3,
|
|
||||||
SPIN = 4
|
|
||||||
};
|
|
||||||
|
|
||||||
class MultiRangeType
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
DEFAULT_MEMBERS(MultiRangeType);
|
|
||||||
|
|
||||||
MultiRangeType& operator=(RangeType& type);
|
|
||||||
MultiRangeType& operator=(const std::vector<MultiRangeType>& multiType);
|
|
||||||
|
|
||||||
MultiRangeType& operator[](size_t num);
|
|
||||||
const MultiRangeType& operator[](size_t num) const;
|
|
||||||
|
|
||||||
bool multi() const;
|
|
||||||
|
|
||||||
bool operator==(const MultiRangeType& in) const;
|
|
||||||
bool operator!=(const MultiRangeType& in) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
void setType(RangeType type);
|
|
||||||
void setMultiType(const std::vector<MultiRangeType>& multiType);
|
|
||||||
|
|
||||||
RangeType mType;
|
|
||||||
std::vector<MultiRangeType>* mMultiType;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class Index>
|
|
||||||
class RangeBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
typedef Index IndexType;
|
|
||||||
|
|
||||||
virtual size_t size() const = 0;
|
|
||||||
virtual Index begin() = 0;
|
|
||||||
virtual Index end() = 0;
|
|
||||||
virtual RangeBase<Index>* base() = 0;
|
|
||||||
virtual bool isSubRange() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
DEFAULT_MEMBERS(RangeBase);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class Range>
|
|
||||||
auto cross(const Range& r1, const Range& r2) -> /**/;
|
|
||||||
|
|
||||||
template <class Range1, class Range2>
|
|
||||||
auto cross(const Range1& r1, const Range2& r2) -> /**/;
|
|
||||||
|
|
||||||
template <class Index>
|
|
||||||
class SubRangeBase : public RangeBase<Index>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual bool isSubRange() const override;
|
|
||||||
protected:
|
|
||||||
DEFAULT_MEMBERS(SubRangeBase);
|
|
||||||
RangeBase<Index>* mBase;
|
|
||||||
std::vector<bool> mOccupation;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename U, RangeType TYPE>;
|
|
||||||
class SingleIndex;
|
|
||||||
|
|
||||||
template <class Rs...>
|
|
||||||
class MultiIndex;
|
|
||||||
|
|
||||||
template <typename U, RangeType TYPE>
|
|
||||||
class SingleRange : public RangeBase<SingleIndex<U,TYPE> >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
DEFAULT_MEMBERS(SingleRange);
|
|
||||||
|
|
||||||
const U& get(size_t pos) const;
|
|
||||||
size_t get(const U& metaPos) const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::vector<U> mSpace;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class... Ranges>
|
|
||||||
class MultiRange : public RangeBase<MultiIndex<typename Ranges::indexType...> >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
DEFAULT_MEMBERS(MultiRange);
|
|
||||||
static size_t dim = sizeof...(Ranges);
|
|
||||||
|
|
||||||
template <size_t N>
|
|
||||||
auto get() -> decltype( std::get<N>(mSpace) );
|
|
||||||
|
|
||||||
protected:
|
|
||||||
std::tuple<Ranges...> mSpace;
|
|
||||||
};
|
|
||||||
|
|
||||||
/******************
|
|
||||||
* Index *
|
|
||||||
******************/
|
|
||||||
|
|
||||||
class IndefinitIndexBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual IndefinitIndexBase& operator=(const IndefinitIndexBase& in) = 0;
|
|
||||||
|
|
||||||
virtual IndefinitIndexBase& operator=(size_t pos) = 0;
|
|
||||||
virtual IndefinitIndexBase& operator++() = 0;
|
|
||||||
virtual IndefinitIndexBase& operator--() = 0;
|
|
||||||
virtual IndefinitIndexBase& operator+=(int n) = 0;
|
|
||||||
virtual IndefinitIndexBase& operator-=(int n) = 0;
|
|
||||||
|
|
||||||
virtual bool operator==(const IndefinitIndexBase& i) = 0;
|
|
||||||
virtual bool operator!=(const IndefinitIndexBase& i) = 0;
|
|
||||||
|
|
||||||
virtual size_t dim() const = 0;
|
|
||||||
virtual size_t pos() const = 0; // = mPos; implement !!!
|
|
||||||
|
|
||||||
std::string& name();
|
|
||||||
const std::string& name() const;
|
|
||||||
|
|
||||||
MultiRangeType rangeType() const = 0;
|
|
||||||
|
|
||||||
virtual bool link(IndefinitIndexBase* toLink);
|
|
||||||
virtual void freeLinked();
|
|
||||||
virtual bool linked() const;
|
|
||||||
virtual void linkTo(IndefinitIndexBase* target) = 0;
|
|
||||||
|
|
||||||
virtual void setPos(size_t pos);
|
|
||||||
|
|
||||||
virtual size_t max() const;
|
|
||||||
virtual size_t outOfRange() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
DEFAULT_MEMBERS(IndefinitIndexBase);
|
|
||||||
|
|
||||||
std::string mName;
|
|
||||||
size_t mPos;
|
|
||||||
|
|
||||||
IndefinitIndexBase* mLinked;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class Index>
|
|
||||||
class IndexBase : public IndefinitIndexBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual Index& operator=(const Index& in) override;
|
|
||||||
|
|
||||||
virtual Index& operator=(size_t pos) override;
|
|
||||||
virtual Index& operator++() override;
|
|
||||||
virtual Index& operator--() override;
|
|
||||||
virtual Index& operator+=(int n) override;
|
|
||||||
virtual Index& operator-=(int n) override;
|
|
||||||
|
|
||||||
virtual bool operator==(const IndexBase& i) override;
|
|
||||||
virtual bool operator!=(const IndexBase& i) override;
|
|
||||||
|
|
||||||
virtual size_t pos() const override; // = mPos; implement !!!
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
DEFAULT_MEMBERS(IndexBase);
|
|
||||||
|
|
||||||
// translate index into position
|
|
||||||
virtual size_t evaluate(const Index& in) const = 0;
|
|
||||||
RangeBase<Index>* mRange;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename U, RangeType TYPE>
|
|
||||||
class SingleIndex : public IndexBase<SingleIndex<U,TYPE> >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
DEFAULT_MEMBERS(SingleIndex);
|
|
||||||
|
|
||||||
virtual size_t size() const override;
|
|
||||||
virtual SingleIndexBase& operator=(size_t pos) override;
|
|
||||||
virtual SingleIndexBase& operator=(const U& upos);
|
|
||||||
virtual const U& getMetaPos() const;
|
|
||||||
|
|
||||||
virtual size_t dim() const override; // = 1
|
|
||||||
|
|
||||||
virtual void linkTo(IndefinitIndexBase* target) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
virtual size_t evaluate(const Index& in) const override;
|
|
||||||
};
|
|
||||||
|
|
||||||
template <class... Indices>
|
|
||||||
class MultiIndex : public IndexBase<MultiIndex<Indices...> >
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
DEFAULT_MEMBERS(MultiIndex);
|
|
||||||
|
|
||||||
typedef std::tuple<Indices...> IndexPack;
|
|
||||||
static size_t sMult = sizeof...(Indices);
|
|
||||||
|
|
||||||
virtual MultiIndex& operator++() override;
|
|
||||||
virtual MultiIndex& operator--() override;
|
|
||||||
virtual MultiIndex& operator+=(int n) override;
|
|
||||||
virtual MultiIndex& operator-=(int n) override;
|
|
||||||
|
|
||||||
template <size_t N>
|
|
||||||
auto& getIndex() -> decltype(std::get<N>(mIPack));
|
|
||||||
|
|
||||||
template <size_t N>
|
|
||||||
const auto& getIndex() const -> decltype(std::get<N>(mIPack));
|
|
||||||
|
|
||||||
IndefinitIndexBase& getIndex(size_t n);
|
|
||||||
const IndefinitIndexBase& getIndex(size_t n) const;
|
|
||||||
|
|
||||||
// dimension of MultiRange
|
|
||||||
virtual size_t dim() const override; // implement !!!
|
|
||||||
|
|
||||||
virtual bool link(IndefinitIndexBase* toLink) override;
|
|
||||||
virtual void linkTo(IndefinitIndexBase* target) override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual bool linkLower(IndefinitIndexBase* toLink);
|
|
||||||
virtual size_t evaluate(const MultiIndex& in) const override;
|
|
||||||
|
|
||||||
IndexPack mIPack;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/******************
|
|
||||||
* MultiArray *
|
|
||||||
******************/
|
|
||||||
|
|
||||||
template <typename T, class Range>
|
|
||||||
class MultiArray
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
DEFAULT_MEMBERS(MultiArray);
|
|
||||||
MultiArray(const Range& range); // !!!!
|
|
||||||
|
|
||||||
template <class... NameTypes>
|
|
||||||
MultiArrayOperation<T,Range>& operator()(const NameTypes&... str) const;
|
|
||||||
|
|
||||||
T& operator()(const typename Range::indexType& i);
|
|
||||||
const T& operator()(const typename Range::indexType& i) const;
|
|
||||||
|
|
||||||
private:
|
|
||||||
bool mInit = false;
|
|
||||||
std::vector<T> mCont;
|
|
||||||
std::shared_ptr<Range> mRange;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***************************
|
|
||||||
* MultiArrayOperation *
|
|
||||||
***************************/
|
|
||||||
|
|
||||||
template <typename T, class Range>
|
|
||||||
class MultiArrayOperationBase
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
MultiArrayOperation(MultiArray<T,Range>& ma, const IndefinitIndexBase& iib);
|
|
||||||
|
|
||||||
// execute AnyOperation
|
|
||||||
// exception if range types are inconsitent with names
|
|
||||||
template <class Range2>
|
|
||||||
MultiArrayOperationBase& operator=(const MultiArrayOperationBase<T, Range2>& in);
|
|
||||||
|
|
||||||
|
|
||||||
template <class Operation, class... Ranges>
|
|
||||||
MultiArrayOperation<Operation> operator()(Operation& op, MultiArrayOperationBase<T,Ranges>&... secs);
|
|
||||||
|
|
||||||
template <class Range2>
|
|
||||||
MultiArrayOperation<std::plus<T>,Range2> operator+(MultiArrayOperationBase<T,Range2>& sec);
|
|
||||||
|
|
||||||
template <class Range2>
|
|
||||||
MultiArrayOperation<std::minus<T>,Range2> operator-(MultiArrayOperationBase<T,Range2>& sec);
|
|
||||||
|
|
||||||
template <class Range2>
|
|
||||||
MultiArrayOperation<std::multiplies<T>,Range2> operator*(MultiArrayOperationBase<T,Range2>& sec);
|
|
||||||
|
|
||||||
template <class Range2>
|
|
||||||
MultiArrayOperation<std::divides<T>,Range2> operator/(MultiArrayOperationBase<T,Range2>& sec);
|
|
||||||
|
|
||||||
virtual size_t argNum() const;
|
|
||||||
|
|
||||||
IndefinitIndexBase* index();
|
|
||||||
|
|
||||||
virtual void linkIndicesTo(IndefinitIndexBase* target);
|
|
||||||
|
|
||||||
virtual T& get();
|
|
||||||
virtual const T& get() const;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
MultiArray<T,Range>& mArrayRef;
|
|
||||||
IndefinitIndexBase* mIibPtr;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
template <typename T, class Range, class Operation, class... Ranges>
|
|
||||||
class MultiArrayOperation : public MultiArrayOperationBase<T,Range>
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
MultiArrayOperation(Operation& op, MultiArrayOperationBase<T,Ranges>&... secs);
|
|
||||||
virtual size_t argNum() const override;
|
|
||||||
|
|
||||||
virtual void linkIndicesTo(IndefinitIndexBase* target) override;
|
|
||||||
|
|
||||||
virtual T& get() override;
|
|
||||||
virtual const T& get() const override;
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
T mVal;
|
|
||||||
Operation mOp;
|
|
||||||
std::tuple<MultiArrayOperationBase<T,Ranges>... > mSecs;
|
|
||||||
};
|
|
||||||
|
|
||||||
// =========
|
|
||||||
// Code that should finally work:
|
|
||||||
|
|
||||||
MultiArray<double,/*Tensor*/,/*Tensor*/,/*3DSpace*/,/*3DSpace*/> ma1;
|
|
||||||
MultiArray<double,/*Tensor*/,/*Tensor*/,/*3DSpace*/,/*3DSpace*/> ma2;
|
|
||||||
MultiArray<double,/*Tensor*/,/*Tensor*/,/*Tensor*/,/*3DSpace*/,/*3DSpace*/,/*3DSpace*/> ma3;
|
|
||||||
|
|
||||||
ma3("mu","nu","lambda","x","y","z") = ma1("mu","nu","x","y") * ma2("nu","lambda","y","z");
|
|
||||||
// operator= operation()
|
|
||||||
// ("mu","nu","lambda","x","y","z") <--- ("mu","nu","x","y","nu","lambda","y","z")
|
|
||||||
|
|
||||||
|
|
||||||
} // end namespace ME
|
|
||||||
|
|
||||||
#include "me.cc"
|
|
||||||
|
|
||||||
#endif
|
|
38
src/multi_array.h
Normal file
38
src/multi_array.h
Normal file
|
@ -0,0 +1,38 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
#ifndef __multi_array_h__
|
||||||
|
#define __multi_array_h__
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
|
#include "base_def.h"
|
||||||
|
#include "multi_array_operation.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
|
||||||
|
template <typename T, class Range>
|
||||||
|
class MultiArray
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DEFAULT_MEMBERS(MultiArray);
|
||||||
|
MultiArray(const Range& range); // !!!!
|
||||||
|
|
||||||
|
template <class... NameTypes>
|
||||||
|
MultiArrayOperation<T,Range>& operator()(const NameTypes&... str) const;
|
||||||
|
|
||||||
|
T& operator()(const typename Range::indexType& i);
|
||||||
|
const T& operator()(const typename Range::indexType& i) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
bool mInit = false;
|
||||||
|
std::vector<T> mCont;
|
||||||
|
std::shared_ptr<Range> mRange;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "multi_array.cc"
|
||||||
|
|
||||||
|
#endif
|
85
src/multi_array_operation.h
Normal file
85
src/multi_array_operation.h
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
#ifndef __multi_array_operation_h__
|
||||||
|
#define __multi_array_operation_h__
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
#include "base_def.h"
|
||||||
|
#include "index_base.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
|
||||||
|
template <typename T, class Range>
|
||||||
|
class MultiArrayOperationBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
MultiArrayOperation(MultiArray<T,Range>& ma, const IndefinitIndexBase& iib);
|
||||||
|
|
||||||
|
// execute AnyOperation
|
||||||
|
// exception if range types are inconsitent with names
|
||||||
|
template <class Range2>
|
||||||
|
MultiArrayOperationBase& operator=(const MultiArrayOperationBase<T, Range2>& in);
|
||||||
|
|
||||||
|
|
||||||
|
template <class Operation, class... Ranges>
|
||||||
|
MultiArrayOperation<Operation> operator()(Operation& op, MultiArrayOperationBase<T,Ranges>&... secs);
|
||||||
|
|
||||||
|
template <class Range2>
|
||||||
|
MultiArrayOperation<std::plus<T>,Range2> operator+(MultiArrayOperationBase<T,Range2>& sec);
|
||||||
|
|
||||||
|
template <class Range2>
|
||||||
|
MultiArrayOperation<std::minus<T>,Range2> operator-(MultiArrayOperationBase<T,Range2>& sec);
|
||||||
|
|
||||||
|
template <class Range2>
|
||||||
|
MultiArrayOperation<std::multiplies<T>,Range2> operator*(MultiArrayOperationBase<T,Range2>& sec);
|
||||||
|
|
||||||
|
template <class Range2>
|
||||||
|
MultiArrayOperation<std::divides<T>,Range2> operator/(MultiArrayOperationBase<T,Range2>& sec);
|
||||||
|
|
||||||
|
virtual size_t argNum() const;
|
||||||
|
|
||||||
|
IndefinitIndexBase* index();
|
||||||
|
|
||||||
|
virtual void linkIndicesTo(IndefinitIndexBase* target);
|
||||||
|
|
||||||
|
virtual T& get();
|
||||||
|
virtual const T& get() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
MultiArray<T,Range>& mArrayRef;
|
||||||
|
IndefinitIndexBase* mIibPtr;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename T, class Range, class Operation, class... Ranges>
|
||||||
|
class MultiArrayOperation : public MultiArrayOperationBase<T,Range>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
MultiArrayOperation(Operation& op, MultiArrayOperationBase<T,Ranges>&... secs);
|
||||||
|
virtual size_t argNum() const override;
|
||||||
|
|
||||||
|
virtual void linkIndicesTo(IndefinitIndexBase* target) override;
|
||||||
|
|
||||||
|
virtual T& get() override;
|
||||||
|
virtual const T& get() const override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
T mVal;
|
||||||
|
Operation mOp;
|
||||||
|
std::tuple<MultiArrayOperationBase<T,Ranges>... > mSecs;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "multi_array_operation.h"
|
||||||
|
|
||||||
|
#endif
|
73
src/multi_range.h
Normal file
73
src/multi_range.h
Normal file
|
@ -0,0 +1,73 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
#ifndef __multi_range_h__
|
||||||
|
#define __multi_range_h__
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
#include "base_def.h"
|
||||||
|
#include "range_base.h"
|
||||||
|
#include "index_base.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
|
||||||
|
template <class... Indices>
|
||||||
|
class MultiIndex : public IndexBase<MultiIndex<Indices...> >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DEFAULT_MEMBERS(MultiIndex);
|
||||||
|
|
||||||
|
typedef std::tuple<Indices...> IndexPack;
|
||||||
|
static size_t sMult = sizeof...(Indices);
|
||||||
|
|
||||||
|
virtual MultiIndex& operator++() override;
|
||||||
|
virtual MultiIndex& operator--() override;
|
||||||
|
virtual MultiIndex& operator+=(int n) override;
|
||||||
|
virtual MultiIndex& operator-=(int n) override;
|
||||||
|
|
||||||
|
template <size_t N>
|
||||||
|
auto& getIndex() -> decltype(std::get<N>(mIPack));
|
||||||
|
|
||||||
|
template <size_t N>
|
||||||
|
const auto& getIndex() const -> decltype(std::get<N>(mIPack));
|
||||||
|
|
||||||
|
IndefinitIndexBase& getIndex(size_t n);
|
||||||
|
const IndefinitIndexBase& getIndex(size_t n) const;
|
||||||
|
|
||||||
|
// dimension of MultiRange
|
||||||
|
virtual size_t dim() const override; // implement !!!
|
||||||
|
|
||||||
|
virtual bool link(IndefinitIndexBase* toLink) override;
|
||||||
|
virtual void linkTo(IndefinitIndexBase* target) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
virtual bool linkLower(IndefinitIndexBase* toLink);
|
||||||
|
virtual size_t evaluate(const MultiIndex& in) const override;
|
||||||
|
|
||||||
|
IndexPack mIPack;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class... Ranges>
|
||||||
|
class MultiRange : public RangeBase<MultiIndex<typename Ranges::indexType...> >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DEFAULT_MEMBERS(MultiRange);
|
||||||
|
static size_t dim = sizeof...(Ranges);
|
||||||
|
|
||||||
|
template <size_t N>
|
||||||
|
auto get() -> decltype( std::get<N>(mSpace) );
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::tuple<Ranges...> mSpace;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "multi_range.cc"
|
||||||
|
|
||||||
|
#endif
|
85
src/range_base.h
Normal file
85
src/range_base.h
Normal file
|
@ -0,0 +1,85 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
#ifndef __range_base_h__
|
||||||
|
#define __range_base_h__
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <vector>
|
||||||
|
#include "base_def.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
|
||||||
|
enum class RangeType
|
||||||
|
{
|
||||||
|
NIL = 0,
|
||||||
|
SPACE = 1,
|
||||||
|
MOMENTUM = 2,
|
||||||
|
LORENTZ = 3,
|
||||||
|
SPIN = 4
|
||||||
|
};
|
||||||
|
|
||||||
|
class MultiRangeType
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DEFAULT_MEMBERS(MultiRangeType);
|
||||||
|
|
||||||
|
MultiRangeType& operator=(RangeType& type);
|
||||||
|
MultiRangeType& operator=(const std::vector<MultiRangeType>& multiType);
|
||||||
|
|
||||||
|
MultiRangeType& operator[](size_t num);
|
||||||
|
const MultiRangeType& operator[](size_t num) const;
|
||||||
|
|
||||||
|
bool multi() const;
|
||||||
|
|
||||||
|
bool operator==(const MultiRangeType& in) const;
|
||||||
|
bool operator!=(const MultiRangeType& in) const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void setType(RangeType type);
|
||||||
|
void setMultiType(const std::vector<MultiRangeType>& multiType);
|
||||||
|
|
||||||
|
RangeType mType;
|
||||||
|
std::vector<MultiRangeType>* mMultiType;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Index>
|
||||||
|
class RangeBase
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef Index IndexType;
|
||||||
|
|
||||||
|
virtual size_t size() const = 0;
|
||||||
|
virtual Index begin() = 0;
|
||||||
|
virtual Index end() = 0;
|
||||||
|
virtual RangeBase<Index>* base() = 0;
|
||||||
|
virtual bool isSubRange() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
DEFAULT_MEMBERS(RangeBase);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class Range>
|
||||||
|
auto cross(const Range& r1, const Range& r2) -> /**/;
|
||||||
|
|
||||||
|
template <class Range1, class Range2>
|
||||||
|
auto cross(const Range1& r1, const Range2& r2) -> /**/;
|
||||||
|
|
||||||
|
template <class Index>
|
||||||
|
class SubRangeBase : public RangeBase<Index>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual bool isSubRange() const override;
|
||||||
|
protected:
|
||||||
|
DEFAULT_MEMBERS(SubRangeBase);
|
||||||
|
RangeBase<Index>* mBase;
|
||||||
|
std::vector<bool> mOccupation;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "range_base.cc"
|
||||||
|
|
||||||
|
#endif
|
53
src/single_range.h
Normal file
53
src/single_range.h
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
#ifndef __single_range_h__
|
||||||
|
#define __single_range_h__
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "base_def.h"
|
||||||
|
#include "index_base.h"
|
||||||
|
#include "range_base.h"
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
|
||||||
|
template <typename U, RangeType TYPE>
|
||||||
|
class SingleIndex : public IndexBase<SingleIndex<U,TYPE> >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
DEFAULT_MEMBERS(SingleIndex);
|
||||||
|
|
||||||
|
virtual size_t size() const override;
|
||||||
|
virtual SingleIndexBase& operator=(size_t pos) override;
|
||||||
|
virtual SingleIndexBase& operator=(const U& upos);
|
||||||
|
virtual const U& getMetaPos() const;
|
||||||
|
|
||||||
|
virtual size_t dim() const override; // = 1
|
||||||
|
|
||||||
|
virtual void linkTo(IndefinitIndexBase* target) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual size_t evaluate(const Index& in) const override;
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename U, RangeType TYPE>
|
||||||
|
class SingleRange : public RangeBase<SingleIndex<U,TYPE> >
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
DEFAULT_MEMBERS(SingleRange);
|
||||||
|
|
||||||
|
const U& get(size_t pos) const;
|
||||||
|
size_t get(const U& metaPos) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
std::vector<U> mSpace;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "single_range.cc"
|
||||||
|
|
||||||
|
#endif
|
60
src/tuple_helper.h
Normal file
60
src/tuple_helper.h
Normal file
|
@ -0,0 +1,60 @@
|
||||||
|
// -*- C++ -*-
|
||||||
|
|
||||||
|
#ifndef __tuple_helper_h__
|
||||||
|
#define __tuple_helper_h__
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
|
#include "base_def.h"
|
||||||
|
|
||||||
|
|
||||||
|
namespace MultiArrayTools
|
||||||
|
{
|
||||||
|
|
||||||
|
template <class Tuple, size_t N>
|
||||||
|
auto make_left_x(const Tuple& tp) -> decltype(std::tuple_cat(make_left<Tuple,N-1>(tp),
|
||||||
|
std::make_tuple(get<N>(tp))))
|
||||||
|
{
|
||||||
|
return std::tuple_cat(make_left<Tuple,N-1>(tp), std::make_tuple(get<N>(tp)));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Tuple>
|
||||||
|
auto make_left_x<Tuple, 0>(const Tuple& tp) -> decltype(std::make_tuple(get<N>(tp)))
|
||||||
|
{
|
||||||
|
return std::make_tuple(get<N>(tp));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Tuple, size_t N>
|
||||||
|
auto make_right_x(const Tuple& tp) -> decltype(std::tuple_cat(std::make_tuple(get<std::tuple_size(tp)-N>(tp)),
|
||||||
|
make_left<Tuple,std::tuple_size(tp)-N+1>(tp)))
|
||||||
|
{
|
||||||
|
const size_t M = std::tuple_size(tp) - N;
|
||||||
|
return std::tuple_cat(std::make_tuple(get<M>(tp)), make_left<Tuple,M+1>(tp));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Tuple>
|
||||||
|
auto make_right_x<Tuple, 0>(const Tuple& tp) -> decltype(std::make_tuple(get<std::tuple_size(tp)>(tp)))
|
||||||
|
{
|
||||||
|
const size_t M = std::tuple_size(tp);
|
||||||
|
return std::make_tuple(get<M>(tp));
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Tuple, size_t N>
|
||||||
|
auto make_left(const Tuple& tp) -> decltype(make_left_x<Tuple, N>(tp))
|
||||||
|
{
|
||||||
|
return make_left_x<Tuple, N>(tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <class Tuple, size_t N>
|
||||||
|
auto make_right(const Tuple& tp) -> decltype(make_right_x<Tuple, std::tuple_size(Tuple)-N>(tp))
|
||||||
|
{
|
||||||
|
return make_right_x<Tuple, std::tuple_size(Tuple)-N>(tp);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#include "tuple_helper.cc"
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in a new issue