// Copyright Toru Niina 2017. // Distributed under the MIT License. #ifndef TOML11_TYPES_HPP #define TOML11_TYPES_HPP #include "datetime.hpp" #include "string.hpp" #include "traits.hpp" #include #include #if __cplusplus >= 201703L #if __has_include() #include #endif #endif namespace toml { using character = char; class value; using key = std::string; using Boolean = bool; using Integer = std::int64_t; using Float = double; using String = ::toml::string; using Datetime = offset_datetime; using OffsetDatetime = offset_datetime; using LocalDatetime = local_datetime; using LocalDate = local_date; using LocalTime = local_time; 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. we can't use it here 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, }; 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::OffsetDatetime: 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() { using type = typename std::remove_cv< typename std::remove_reference::type >::type; return std::is_same::value ? value_t::Boolean : std::is_integral::value ? value_t::Integer : std::is_floating_point::value ? value_t::Float : std::is_same::value ? value_t::String : std::is_same::value ? value_t::String : std::is_same::value ? value_t::LocalDate : std::is_same::value ? value_t::LocalTime : is_chrono_duration::value ? value_t::LocalTime : std::is_same::value ? value_t::LocalDatetime : std::is_same::value ? value_t::OffsetDatetime : std::is_same::value ? value_t::OffsetDatetime : std::is_convertible::value ? value_t::Array : std::is_convertible::value ? value_t::Table : value_t::Unknown; } constexpr inline bool is_valid(value_t vt) { return vt != 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 floating 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 toml_value_t {static constexpr value_t value = value_t::Unknown ;}; template<> struct toml_value_t{static constexpr value_t value = value_t::Boolean ;}; template<> struct toml_value_t{static constexpr value_t value = value_t::Integer ;}; template<> struct toml_value_t{static constexpr value_t value = value_t::Float ;}; template<> struct toml_value_t{static constexpr value_t value = value_t::String ;}; template<> struct toml_value_t{static constexpr value_t value = value_t::OffsetDatetime;}; template<> struct toml_value_t{static constexpr value_t value = value_t::LocalDatetime ;}; template<> struct toml_value_t{static constexpr value_t value = value_t::LocalDate ;}; template<> struct toml_value_t{static constexpr value_t value = value_t::LocalTime ;}; template<> struct toml_value_t{static constexpr value_t value = value_t::Array ;}; template<> struct toml_value_t{static constexpr value_t value = value_t::Table ;}; 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>, #if __cplusplus >= 201703L negation>, #endif 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