#pragma once #include "fusion_static_dispatch.hpp" #include #include #include #include #include #include template struct fusion_model { private: fusion_model(T); }; struct FusionModelInterface { virtual size_t row_count() const {throw std::runtime_error("\"row_count()\" not implemented for this model");} virtual size_t column_count() const {throw std::runtime_error("\"column_count()\" not implemented for this model");} virtual std::string field_name(size_t section) const {throw std::runtime_error("\"field_name(size_t)\" not implemented for this model");} virtual std::string key(size_t section) const {throw std::runtime_error("\"key(size_t)\" not implemented for this model");} virtual boost::any get_cell(size_t row, size_t column) const {throw std::runtime_error("\"get_cell(size_t, size_t)\" not implemented for this model");} }; template struct fusion_model> : public FusionModelInterface { static_assert(friendly_fusion::traits::is_sequence::type::value, "T is not a boost fusion sequence"); typedef std::vector data_type; typedef T row_type; static constexpr bool has_header_h = true; static constexpr bool has_header_v = false; std::vector data; virtual size_t row_count() const override final { return data.size(); } virtual size_t column_count() const override final { return boost::fusion::result_of::size::type::value; } virtual std::string field_name(size_t section) const override final { return get_nth_name(section); } virtual boost::any get_cell(size_t row, size_t column) const override final { return get_nth(data[row], column); } }; template struct fusion_model> : public FusionModelInterface { static_assert(boost::fusion::traits::is_sequence::type::value, "T is not a boost fusion sequence"); typedef std::map data_type; typedef T row_type; static constexpr bool has_header_h = true; static constexpr bool has_header_v = true; std::map data; virtual size_t row_count() const override final { return data.size(); } virtual size_t column_count() const override final { return boost::fusion::result_of::size::type::value; } virtual std::string field_name(size_t section) const override final { return get_nth_name(section); } virtual std::string key(size_t section) const override final { auto cit = data.cbegin(); std::advance(cit, section); return cit->first; } virtual boost::any get_cell(size_t row, size_t column) const override final { auto cit = data.cbegin(); std::advance(cit, row); return get_nth(cit->second, column); } };