#ifndef TOML11_TYPES_H #define TOML11_TYPES_H #include "datetime.hpp" #include "traits.hpp" #include #include #include #include namespace toml { using character = char; class value; using key = std::basic_string; using Boolean = bool; using Integer = std::int64_t; using Float = double; using String = std::basic_string; using Datetime = offset_datetime; using Array = std::vector; using Table = std::unordered_map; // alias for snake_case, consistency with STL/Boost, toml::key, toml::value using boolean = Boolean; using integer = Integer; using floating = Float; // XXX float is keyword using string = String; // these are defined in datetime.hpp // offset_datetime // local_datetime // local_date // local_time using array = Array; using table = Table; enum class value_t : std::uint8_t { Empty = 0, Boolean = 1, Integer = 2, Float = 3, String = 4, OffsetDatetime = 5, LocalDatetime = 6, LocalDate = 7, LocalTime = 8, Array = 9, Table = 10, Unknown = 255, }; constexpr inline bool is_valid(value_t vt) { return vt != value_t::Unknown; } template inline std::basic_ostream& operator<<(std::basic_ostream& os, value_t t) { switch(t) { case toml::value_t::Boolean : os << "boolean"; return os; case toml::value_t::Integer : os << "integer"; return os; case toml::value_t::Float : os << "float"; return os; case toml::value_t::String : os << "string"; return os; case toml::value_t::Datetime : os << "offset_datetime"; return os; case toml::value_t::LocalDatetime: os << "local_datetime"; return os; case toml::value_t::LocalDate : os << "local_date"; return os; case toml::value_t::LocalTime : os << "local_time"; return os; case toml::value_t::Array : os << "array"; return os; case toml::value_t::Table : os << "table"; return os; case toml::value_t::Empty : os << "empty"; return os; case toml::value_t::Unknown : os << "unknown"; return os; default : os << "nothing"; return os; } } template, typename alloc = std::allocator> inline std::basic_string stringize(value_t t) { std::ostringstream oss; oss << t; return oss.str(); } namespace detail { template constexpr inline value_t check_type() { return std::is_same, toml::Boolean >::value ? value_t::Boolean : std::is_integral>::value ? value_t::Integer : std::is_floating_point>::value ? value_t::Float : std::is_convertible, toml::String >::value ? value_t::String : std::is_convertible, toml::Datetime>::value ? value_t::Datetime: std::is_convertible, toml::Array >::value ? value_t::Array : std::is_convertible, toml::Table >::value ? value_t::Table : value_t::Unknown; } template struct toml_default_type; template<> struct toml_default_type {typedef Boolean type;}; template<> struct toml_default_type {typedef Integer type;}; template<> struct toml_default_type {typedef Float type;}; template<> struct toml_default_type {typedef String type;}; template<> struct toml_default_type {typedef offset_datetime type;}; template<> struct toml_default_type{typedef local_datetime type;}; template<> struct toml_default_type {typedef local_date type;}; template<> struct toml_default_type {typedef local_time type;}; template<> struct toml_default_type {typedef Array type;}; template<> struct toml_default_type {typedef Table type;}; template<> struct toml_default_type {typedef void type;}; template<> struct toml_default_type {typedef void type;}; template struct is_exact_toml_type : disjunction< std::is_same, std::is_same, std::is_same, std::is_same, std::is_same, std::is_same, std::is_same, std::is_same, std::is_same, std::is_same >{}; template struct is_exact_toml_type : is_exact_toml_type{}; template struct is_exact_toml_type : is_exact_toml_type{}; template struct is_exact_toml_type : is_exact_toml_type{}; template struct is_exact_toml_type: is_exact_toml_type{}; template struct is_map : conjunction< has_iterator, has_value_type, has_key_type, has_mapped_type >{}; template struct is_map : is_map{}; template struct is_map : is_map{}; template struct is_map : is_map{}; template struct is_map : is_map{}; template struct is_container : conjunction< negation>, negation>, has_iterator, has_value_type >{}; template struct is_container : is_container{}; template struct is_container : is_container{}; template struct is_container : is_container{}; template struct is_container : is_container{}; } // detail } // toml #endif// TOML11_TYPES_H