/*******************************************************************************
*
* TRIQS: a Toolbox for Research in Interacting Quantum Systems
*
* Copyright (C) 2012 by M. Ferrero, 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 .
*
******************************************************************************/
#pragma once
#include
#include "triqs/utility/complex_ops.hpp"
#include
#include
#include
#include
namespace triqs {
namespace gfs {
namespace mpl = boost::mpl;
namespace tag {
struct composite {};
struct mesh_point {};
}
// scalar_valued, matrix_valued, tensor_valued
struct scalar_valued {};
template struct tensor_valued {
static_assert(R > 0, "tensor_valued only for rank >0");
};
struct matrix_valued {};
//------------------------------------------------------
using dcomplex = std::complex;
/** The statistics : Boson or Fermion
*/
enum statistic_enum {
Boson,
Fermion
};
struct freq_infty {}; // the point at infinity
//------------------------------------------------------
template struct closest_pt_wrap;
template struct closest_pt_wrap : tag::mesh_point {
T value;
template explicit closest_pt_wrap(U &&x) : value(std::forward(x)) {}
};
template struct closest_pt_wrap : tag::mesh_point {
std::tuple value_tuple;
template explicit closest_pt_wrap(U &&... x) : value_tuple(std::forward(x)...) {}
};
template closest_pt_wrap closest_mesh_pt(T &&... x) {
return closest_pt_wrap{std::forward(x)...};
}
//------------------------------------------------------
// A simple replacement of tail when there is none to maintain generic code simple...
struct nothing {
template explicit nothing(Args &&...) {} // takes anything, do nothing..
nothing() {}
using view_type = nothing;
using regular_type = nothing;
void rebind(nothing) {}
template void operator=(RHS &&) {}
friend void h5_write(h5::group, std::string subgroup_name, nothing) {}
friend void h5_read(h5::group, std::string subgroup_name, nothing) {}
friend class boost::serialization::access;
template void serialize(Archive &ar, const unsigned int version) {}
friend nothing operator+(nothing, nothing) { return nothing(); }
template friend void assign_from_expression(nothing &, RHS) {}
};
template nothing slice_target(nothing, T...) { return nothing(); }
template nothing operator+(nothing, T const &) { return nothing(); }
template nothing operator-(nothing, T const &) { return nothing(); }
template nothing operator*(nothing, T const &) { return nothing(); }
template nothing operator/(nothing, T const &) { return nothing(); }
template TYPE_DISABLE_IF(nothing, std::is_same) operator+(T const &, nothing) { return nothing(); }
template TYPE_DISABLE_IF(nothing, std::is_same) operator-(T const &, nothing) { return nothing(); }
template TYPE_DISABLE_IF(nothing, std::is_same) operator*(T const &, nothing) { return nothing(); }
template TYPE_DISABLE_IF(nothing, std::is_same) operator/(T const &, nothing) { return nothing(); }
}
}