// -*- C++ -*-

#ifndef __multi_array_header_h__
#define __multi_array_header_h__

#include <cstdlib>
#include "base_def.h"
#include "range_base.h"
#include "index_base.h"
#include "single_range.h"
#include "multi_range.h"
#include "multi_array_operation.h"
#include "multi_array.h"
#include "slice.h"
#include "manipulator.h"
#include "range_transformer.h"
#include "ma_functional.h"

namespace MultiArrayTools
{
    
    /*********************************
     *   Some standard definitions   *
     *********************************/

    // ===== Index Types =====

    typedef SingleIndex<size_t,RangeType::ANY> GenericNI;
    typedef SingleIndex<double,RangeType::ANY> GenericFI;
    typedef SingleIndex<size_t,RangeType::LORENTZ> LorentzI;
    typedef SingleIndex<int,RangeType::SPACE> Space1dNI;
    typedef SingleIndex<int,RangeType::MOMENTUM> Mom1dNI;
    typedef SingleIndex<size_t,RangeType::ENSEMBLE> EnsI;
    // ...

    // ===== Range Types =====

    typedef SingleRange<size_t,RangeType::ANY> GenericNR;
    typedef SingleRange<double,RangeType::ANY> GenericFR;
    typedef SingleRange<size_t,RangeType::LORENTZ> LorentzR;
    typedef SingleRange<int,RangeType::SPACE> Space1dNR;
    typedef SingleRange<size_t,RangeType::DISTANCE> DistanceNR;
    typedef SingleRange<int,RangeType::MOMENTUM> Mom1dNR;
    typedef SingleRange<size_t, RangeType::ENSEMBLE> EnsR;
    typedef MultiRange<Space1dNR,Space1dNR,Space1dNR> Space3dNR;
    typedef MultiRange<Mom1dNR,Mom1dNR,Mom1dNR> Mom3dNR;
    typedef SingleRange<VET, RangeType::VALUE_ERROR> ValErrR;
    // ...
    
}

#endif