3
0
mirror of https://github.com/triqs/dft_tools synced 2024-12-26 14:23:38 +01:00
dft_tools/triqs/arrays/indexmaps/range.hpp
Olivier Parcollet f2c7d449cc First commit : triqs libs version 1.0 alpha1
for earlier commits, see TRIQS0.x repository.
2013-07-17 19:24:07 +02:00

60 lines
2.1 KiB
C++

/*******************************************************************************
*
* TRIQS: a Toolbox for Research in Interacting Quantum Systems
*
* Copyright (C) 2011 by O. Parcollet
*
* TRIQS is free software: you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later
* version.
*
* TRIQS is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* TRIQS. If not, see <http://www.gnu.org/licenses/>.
*
******************************************************************************/
#ifndef TRIQS_ARRAYS_RANGE_H
#define TRIQS_ARRAYS_RANGE_H
#include <ostream>
namespace triqs { namespace arrays {
/**
*/
class range {
std::ptrdiff_t first_, last_, step_;
public:
range():first_(0),last_(-1),step_(1) {} // i.e. all
range(const range& r):first_(r.first_), last_(r.last_), step_(r.step_) {}
range(std::ptrdiff_t first__, std::ptrdiff_t last__, std::ptrdiff_t step__=1):first_(first__), last_(last__), step_(step__) {}
std::ptrdiff_t first() const { return first_;}
std::ptrdiff_t last () const { return last_;}
std::ptrdiff_t step() const { return step_;}
size_t size() const { std::ptrdiff_t r = (last_ - first_ + 1)/step_; if (r<0) TRIQS_RUNTIME_ERROR <<" range with negative size"; return size_t(r);}
range operator+(std::ptrdiff_t shift) const { return range(first_ + shift, last_ + shift, step_); }
friend inline std::ostream& operator<<(std::ostream& os, const range& range) {
os << "range(" << range.first() << "," << range.last() << "," << range.step() << ")";
return os;
}
};
/**
*/
class ellipsis : public range {
public :
ellipsis( std::ptrdiff_t first__, std::ptrdiff_t last__, std::ptrdiff_t step__=1): range(first__, last__, step__) {}
ellipsis() : range() {}
};
}}//namespace triqs::arrays
#endif