/******************************************************************************* * * 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(); } } }