types.hpp #
型情報を与えるクラスが定義されます。
type_config
#
type_config
は、toml::basic_value
に与えられるパラメータをまとめた型です。
toml::basic_value<T>
内で異なる型を使用する場合、これを別に定義して渡します。
記載のある要素は全て必須の要素です。
通常のストリーム演算子を使用できない数値型を使用する場合、read_int
、read_float
に相当するものを定義し、置き換えてください。
namespace toml
{
struct type_config
{
using comment_type = preserve_comments;
using boolean_type = bool;
using integer_type = std::int64_t;
using floating_type = double;
using string_type = std::string;
template<typename T>
using array_type = std::vector<T>;
template<typename K, typename T>
using table_type = std::unordered_map<K, T>;
static result<integer_type, error_info>
parse_int(const std::string& str, const source_location src, const std::uint8_t base);
static result<floating_type, error_info>
parse_float(const std::string& str, const source_location src, const bool is_hex);
};
using value = basic_value<type_config>;
using table = typename value::table_type;
using array = typename value::array_type;
} // toml
static
メンバ関数
#
parse_int(str, src, base)
#
static result<integer_type, error_info>
parse_int(const std::string& str, const source_location src, const std::uint8_t base);
通常のストリーム演算子などを使用できない型をinteger_type
として使用する場合、この関数を実装してください。
str
には、prefix、(0x
などの場合)leading zero、underscoreが取り除かれた文字列が渡されます。
src
には、その文字列が定義されていた箇所を指すsource_location
が渡されます。
base
には、10
, 2
, 8
, 16
のいずれかが渡されます。
parse_float(str, src, is_hex)
#
static result<floating_type, error_info>
parse_float(const std::string& str, const source_location src, const bool is_hex);
通常のストリーム演算子などを使用できない型をfloating_type
として使用する場合、この関数を実装してください。
str
には、prefix、leading zero、underscoreが取り除かれた文字列が渡されます。
src
には、その文字列が定義されていた箇所を指すsource_location
が渡されます。
is_hex
には、フォーマットがhexfloat
であるかどうかが渡されます。hexfloat
拡張を使用しない場合は使われないので、実装する必要はありません。
hexfloat
拡張に関しては、spec.hppを参照してください。
非メンバ関数 #
read_int
#
template<typename T>
result<T, error_info>
read_int(const std::string& str, const source_location src, const std::uint8_t base);
デフォルトで使用される関数です。std::istringstream
を使用してパースします。
operator>>
とstd::hex
等のマニピュレータ、std::numeric_limits<T>
が定義されている場合(boost::multiprecision
など)、特に変更なしにこれを使用できます。
read_float
#
template<typename T>
result<T, error_info>
read_float(const std::string& str, const source_location src, const bool is_hex);
デフォルトで使用される関数です。decimalの場合はstd::istringstream
を、hexfloatの場合はsscanf()
を使用してパースします。
double
、float
に対応しています。
それ以外の型の場合、operator>>
が定義されていて、かつhex
を使用しないなら、これを使用できます。
ordered_type_config
#
ordered_type_config
は、toml::type_config
のテーブル型をtoml::ordered_map
に変更したものです。
また、toml::ordered_value
エイリアスを定義します。
そのほかにtype_config
との違いはありません。
namespace toml
{
struct ordered_type_config
{
using comment_type = preserve_comments;
using boolean_type = bool;
using integer_type = std::int64_t;
using floating_type = double;
using string_type = std::string;
template<typename T>
using array_type = std::vector<T>;
template<typename K, typename T>
using table_type = ordered_map<K, T>;
static result<integer_type, error_info>
parse_int(const std::string& str, const source_location src, const std::uint8_t base)
{
return read_int<integer_type>(str, src, base);
}
static result<floating_type, error_info>
parse_float(const std::string& str, const source_location src, const bool is_hex)
{
return read_float<floating_type>(str, src, is_hex);
}
};
using ordered_value = basic_value<ordered_type_config>;
using ordered_table = typename ordered_value::table_type;
using ordered_array = typename ordered_value::array_type;
} // toml