cnorxz/src/range_base.h

96 lines
1.8 KiB
C
Raw Normal View History

2017-02-16 11:20:40 +01:00
// -*- C++ -*-
#ifndef __range_base_h__
#define __range_base_h__
#include <cstdlib>
#include <vector>
#include <memory>
2017-02-16 11:20:40 +01:00
#include "base_def.h"
namespace MultiArrayTools
{
enum class RangeType
{
NIL = 0,
ANY = 1,
SPACE = 2,
MOMENTUM = 3,
LORENTZ = 4,
SPIN = 5,
ENSEMBLE = 6
2017-02-16 11:20:40 +01:00
};
class MultiRangeType
{
public:
DEFAULT_MEMBERS(MultiRangeType);
MultiRangeType(const RangeType& type);
MultiRangeType(const std::vector<MultiRangeType>& multiType);
~MultiRangeType();
2017-02-16 11:20:40 +01:00
MultiRangeType& operator=(const RangeType& type);
2017-02-16 11:20:40 +01:00
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() const = 0;
virtual Index end() const = 0;
virtual RangeBase<Index>* base();
2017-02-16 11:20:40 +01:00
virtual bool isSubRange() const;
virtual MultiRangeType type() const = 0;
2017-02-16 11:20:40 +01:00
protected:
DEFAULT_MEMBERS(RangeBase);
};
//template <class Range>
//auto cross(const Range& r1, const Range& r2) -> /**/;
2017-02-16 11:20:40 +01:00
//template <class Range1, class Range2>
//auto cross(const Range1& r1, const Range2& r2) -> /**/;
2017-02-16 11:20:40 +01:00
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