Merge branch remote into v3

This commit is contained in:
ToruNiina
2019-06-17 12:10:40 +09:00
2 changed files with 130 additions and 174 deletions

View File

@@ -423,48 +423,6 @@ T get(const basic_value<C, M, V>& v)
// ============================================================================
// find and get
// for toml::table.
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<detail::is_map<Table>,
detail::is_basic_value<typename Table::mapped_type>>::value,
decltype(::toml::get<T>(std::declval<typename Table::mapped_type&>()))>
find(Table& tab, const toml::key& ky, std::string tn = "unknown table")
{
if(tab.count(ky) == 0)
{
throw std::out_of_range(concat_to_string(
"[error] key \"", ky, "\" not found in ", tn));
}
return ::toml::get<T>(tab.at(ky));
}
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<detail::is_map<Table>,
detail::is_basic_value<typename Table::mapped_type>>::value,
decltype(::toml::get<T>(std::declval<typename Table::mapped_type const&>()))>
find(Table const& tab, const toml::key& ky, std::string tn = "unknown table")
{
if(tab.count(ky) == 0)
{
throw std::out_of_range(concat_to_string(
"[error] key \"", ky, "\" not found in ", tn));
}
return ::toml::get<T>(tab.at(ky));
}
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<detail::is_map<Table>,
detail::is_basic_value<typename Table::mapped_type>>::value,
decltype(::toml::get<T>(std::declval<typename Table::mapped_type &&>()))>
find(typename std::remove_reference<Table>&& tab, const toml::key& ky,
std::string tn = "unknown table")
{
if(tab.count(ky) == 0)
{
throw std::out_of_range(concat_to_string(
"[error] key \"", ky, "\" not found in ", tn));
}
return ::toml::get<T>(std::move(tab.at(ky)));
}
// ----------------------------------------------------------------------------
// these overloads do not require to set T. and returns value itself.
template<typename C,
@@ -869,107 +827,6 @@ find_or(const basic_value<C, M, V>& v, const toml::key& ky, T&& opt)
return get_or(tab.at(ky), std::forward<T>(opt));
}
// ===========================================================================
// find_or(table, key, opt)
// ---------------------------------------------------------------------------
// exact types (return type can be a reference)
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<
detail::is_map<Table>, detail::is_basic_value<typename Table::mapped_type>,
detail::is_exact_toml_type<T, typename Table::mapped_type>
>::value, T> const&
find_or(const Table& tab, const key& ky, const T& opt)
{
if(tab.count(ky) == 0) {return opt;}
return get_or(tab.at(ky), opt);
}
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<
detail::is_map<Table>, detail::is_basic_value<typename Table::mapped_type>,
detail::is_exact_toml_type<T, typename Table::mapped_type>
>::value, T>&
find_or(Table& tab, const key& ky, T& opt)
{
if(tab.count(ky) == 0) {return opt;}
return get_or(tab[ky], opt);
}
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<
detail::is_map<Table>, detail::is_basic_value<typename Table::mapped_type>,
detail::is_exact_toml_type<T, typename Table::mapped_type>
>::value, T>&&
find_or(typename std::remove_reference<Table>::type&& tab, const key& ky, T&& opt)
{
if(tab.count(ky) == 0) {return opt;}
return get_or(std::move(tab[ky]), std::forward<T>(opt));
}
// ---------------------------------------------------------------------------
// std::string (return type can be a reference)
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<
detail::is_map<Table>, detail::is_basic_value<typename Table::mapped_type>,
std::is_same<T, std::string>
>::value, std::string> const&
find_or(const Table& tab, const key& ky, const T& opt)
{
if(tab.count(ky) == 0) {return opt;}
return get_or(tab.at(ky), opt);
}
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<
detail::is_map<Table>, detail::is_basic_value<typename Table::mapped_type>,
std::is_same<T, std::string>
>::value, std::string>&
find_or(Table& tab, const key& ky, T& opt)
{
if(tab.count(ky) == 0) {return opt;}
return get_or(tab[ky], opt);
}
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<
detail::is_map<Table>, detail::is_basic_value<typename Table::mapped_type>,
std::is_same<T, std::string>
>::value, std::string>
find_or(Table&& tab, const key& ky, T&& opt)
{
if(tab.count(ky) == 0) {return std::forward<T>(opt);}
return get_or(std::move(tab[ky]), std::forward<T>(opt));
}
// ---------------------------------------------------------------------------
// string literal (deduced as std::string)
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<
detail::is_map<Table>,
detail::is_basic_value<typename Table::mapped_type>,
detail::is_string_literal<typename std::remove_reference<T>::type>
>::value, std::string>
find_or(const Table& tab, const key& ky, T&& opt)
{
if(tab.count(ky) == 0) {return std::string(opt);}
return get_or(tab.at(ky), std::forward<T>(opt));
}
// ---------------------------------------------------------------------------
// others (require type conversion and return type cannot be lvalue reference)
template<typename T, typename Table>
detail::enable_if_t<detail::conjunction<
detail::is_map<Table>,
detail::is_basic_value<typename Table::mapped_type>,
detail::negation<detail::is_exact_toml_type<T, typename Table::mapped_type>>,
detail::negation<std::is_same<T, std::string>>,
detail::negation<detail::is_string_literal<typename std::remove_reference<T>::type>>
>::value, T>
find_or(const Table& tab, const key& ky, T&& opt)
{
if(tab.count(ky) == 0) {return opt;}
return get_or(tab.at(ky), std::forward<T>(opt));
}
// ============================================================================
// expect