mirror of
https://github.com/bolero-MURAKAMI/Sprout.git
synced 2024-12-23 21:25:49 +00:00
fix README
This commit is contained in:
parent
196aa8dfbd
commit
cdabf2a7f3
4 changed files with 223 additions and 171 deletions
119
README
119
README
|
@ -6,92 +6,89 @@ C++11 constexpr based Containers, Algorithms, Random numbers, Parsing, Ray traci
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*ドキュメント (Document)
|
* ドキュメント (Document)
|
||||||
|
|
||||||
Sprout C++ Library Wiki: http://www.boleros.x0.com/doc/sproutwiki/
|
Sprout C++ Library Wiki: http://www.boleros.x0.com/doc/sproutwiki/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*インストール (Install)
|
* インストール (Install)
|
||||||
|
|
||||||
<sprout/*> にライブラリのディレクトリにパスを通す。
|
ディレクトリ /path/to/sprout にパスを通す。
|
||||||
このライブラリはヘッダオンリーで使える。
|
このライブラリはヘッダオンリーで使える。
|
||||||
(Trough the path to the directory of the library to <sprout/*>.
|
(Through the path to the directory. /path/to/sprout
|
||||||
This library can be used in the header only.)
|
This library can be used in the header only.)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*主なコンテンツ (Main contents)
|
* コンテンツ (contents)
|
||||||
|
|
||||||
constexpr コンテナ (Containers)
|
- コンテナとデータ構造 (Containers and Data structures)
|
||||||
sprout/array.hpp
|
-- sprout/array.hpp - std::array 互換の固定長コンテナ
|
||||||
sprout/string.hpp
|
-- sprout/string.hpp - 固定長バッファの文字列クラス
|
||||||
|
-- sprout/tuple.hpp - std::tuple 互換のタプル
|
||||||
|
-- sprout/variant.hpp - バリアント
|
||||||
|
|
||||||
constexpr タプル (Tuples)
|
- アルゴリズム (Algorithms)
|
||||||
sprout/tuple.hpp
|
-- sprout/algorithm.hpp - STL 互換の非変更アルゴリズムと、変更アルゴリズム
|
||||||
|
-- sprout/algorithm/string.hpp - 文字列用アルゴリズム
|
||||||
|
-- sprout/numeric.hpp - STL 互換の非変更数値アルゴリズムと、変更数値アルゴリズム
|
||||||
|
-- sprout/range/algorithm.hpp - Rangeベースのアルゴリズム
|
||||||
|
-- sprout/range/numeric.hpp - Rangeベースの数値アルゴリズム
|
||||||
|
-- sprout/range/adaptor.hpp - Rangeアダプタ
|
||||||
|
-- sprout/numeric/dft.hpp - 離散フーリエ変換
|
||||||
|
-- sprout/range/numeric/dft.hpp - Rangeベースの離散フーリエ変換
|
||||||
|
|
||||||
constexpr バリアント (Variants)
|
- コンテナサポート (Container supports)
|
||||||
sprout/variant.hpp
|
-- sprout/sub_array.hpp - 切り出された部分コンテナ
|
||||||
|
-- sprout/pit.hpp - 処理結果のコンテナを返す関数に与えるダミーコンテナ &color(red,white){ ← new!};
|
||||||
|
-- sprout/operation.hpp - コンテナを変更する操作
|
||||||
|
-- sprout/container.hpp - コンテナ特性を定義するトレイトと関数
|
||||||
|
|
||||||
constexpr アルゴリズム (Algorithms)
|
- 関数オブジェクト (Function Objects)
|
||||||
sprout/algorithm.hpp
|
-- sprout/functional.hpp - STL 互換の関数オブジェクトとハッシュ関数
|
||||||
sprout/numeric.hpp
|
|
||||||
|
|
||||||
constexpr 範囲アルゴリズム (Range algorithms)
|
- イテレータ (Iterators)
|
||||||
sprout/range/algorithm.hpp
|
-- sprout/iterator.hpp - STL 互換のイテレータと、いくつかの定義済みイテレータ
|
||||||
sprout/range/numeric.hpp
|
|
||||||
|
|
||||||
constexpr Rangeアダプタ (Range adaptors)
|
- 数学 (Mathematics)
|
||||||
sprout/range/adaptor.hpp
|
-- sprout/math/functions.hpp - 数学関数
|
||||||
|
-- sprout/random.hpp - 乱数
|
||||||
|
-- sprout/complex.hpp - 複素数
|
||||||
|
-- sprout/rational.hpp - 有理数
|
||||||
|
|
||||||
constexpr コンテナ操作 (Container operations)
|
- テンプレートメタプログラミング (Template Metaprogramming)
|
||||||
sprout/operation.hpp
|
-- sprout/index_tuple.hpp - IndexTuple イディオム
|
||||||
|
-- sprout/type_traits.hpp - 型特性
|
||||||
|
-- sprout/type.hpp - 型リスト
|
||||||
|
|
||||||
constexpr 乱数 (Random numbers)
|
- プリプロセッサメタプログラミング (Preprocessor Metaprogramming)
|
||||||
sprout/random.hpp
|
-- /sprout/preprocessor.hpp - プリプロセッサメタプログラミングツール
|
||||||
sprout/random/unique_seed.hpp
|
|
||||||
|
|
||||||
constexpr 数学関数 (Mathematical functions)
|
- ドメイン固有 (Domain specific)
|
||||||
sprout/math/functions.hpp
|
-- sprout/uuid.hpp - UUID
|
||||||
sprout/math/common_factor.hpp
|
-- sprout/checksum/sha1.hpp - SHA-1
|
||||||
|
|
||||||
constexpr 複素数/有理数 (Complex numbers, Rational numbers)
|
- 構文解析 (Parsing)
|
||||||
sprout/complex.hpp
|
-- sprout/weed.hpp - Boost.Spirit.Qi ライクなコンパイル時パーサコンビネータ
|
||||||
sprout/rational.hpp
|
|
||||||
|
|
||||||
constexpr 関数オブジェクト (Functors)
|
- レイトレーシング (Ray tracing)
|
||||||
sprout/functional.hpp
|
-- sprout/darkroom.hpp - コンパイル時レイトレーサ
|
||||||
|
|
||||||
constexpr ハッシュ関数 (Hash functions)
|
- その他 (Miscellaneous)
|
||||||
sprout/checksum/sha1.hpp
|
-- sprout/utility.hpp - <utility> 互換の機能と、雑多なユーティリティ
|
||||||
sprout/functional/hash.hpp
|
-- sprout/bit.hpp - ビット操作
|
||||||
|
|
||||||
constexpr UUID (UUID)
|
- C互換 (C-compatible)
|
||||||
sprout/uuid.hpp
|
-- sprout/cstdlib.hpp - <cstdlib> 互換の機能
|
||||||
|
-- sprout/cstring.hpp - <cstring> 互換の機能
|
||||||
型リスト (Type lists)
|
-- sprout/cwchar.hpp - <cwchar> 互換の機能
|
||||||
sprout/type.hpp
|
-- sprout/cctype.hpp - <cctype> 互換の機能
|
||||||
|
-- sprout/cinttypes.hpp - <cinttypes> 互換の機能
|
||||||
コンテナアダプタ (Container adopters)
|
|
||||||
sprout/sub_array.hpp
|
|
||||||
sprout/pit.hpp
|
|
||||||
|
|
||||||
コンテナ特性 (Container traits)
|
|
||||||
sprout/container.hpp
|
|
||||||
|
|
||||||
constexpr 離散フーリエ変換 (Discrete Fourier transforms)
|
|
||||||
sprout/numeric/dft.hpp
|
|
||||||
sprout/range/numeric/dft.hpp
|
|
||||||
|
|
||||||
constexpr 構文解析 (Parsing)
|
|
||||||
sprout/weed.hpp
|
|
||||||
|
|
||||||
constexpr レイトレーシング (Ray tracing)
|
|
||||||
sprout/darkroom.hpp
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*コンフィグ用ユーザマクロ (User macros for configuration)
|
* コンフィグ用ユーザマクロ (User macros for configuration)
|
||||||
|
|
||||||
#define SPROUT_CONFIG_DISABLE_CONSTEXPR
|
#define SPROUT_CONFIG_DISABLE_CONSTEXPR
|
||||||
このマクロが定義されているとき、関数は constexpr 指定されない。
|
このマクロが定義されているとき、関数は constexpr 指定されない。
|
||||||
|
@ -155,7 +152,7 @@ https://github.com/sscrisk/CEL---ConstExpr-Library
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*作者 (Author)
|
* 作者 (Author)
|
||||||
|
|
||||||
Bolero MURAKAMI
|
Bolero MURAKAMI
|
||||||
Blog: http://d.hatena.ne.jp/boleros/
|
Blog: http://d.hatena.ne.jp/boleros/
|
||||||
|
@ -164,7 +161,7 @@ Mail: contact-lib@boleros.x0.com
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
*著作権等 (Copyrights)
|
* 著作権等 (Copyrights)
|
||||||
|
|
||||||
このライブラリは Boost Software License の元で公開されています。
|
このライブラリは Boost Software License の元で公開されています。
|
||||||
|
|
||||||
|
|
|
@ -10,20 +10,24 @@ namespace sprout {
|
||||||
// begin
|
// begin
|
||||||
//
|
//
|
||||||
template<typename Container>
|
template<typename Container>
|
||||||
inline typename sprout::container_traits<Container>::iterator begin(Container& cont) {
|
inline typename sprout::container_traits<Container>::iterator
|
||||||
|
begin(Container& cont) {
|
||||||
return cont.begin();
|
return cont.begin();
|
||||||
}
|
}
|
||||||
template<typename T, std::size_t N>
|
template<typename T, std::size_t N>
|
||||||
inline typename sprout::container_traits<T[N]>::iterator begin(T (& arr)[N]) {
|
inline typename sprout::container_traits<T[N]>::iterator
|
||||||
|
begin(T (& arr)[N]) {
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Container>
|
template<typename Container>
|
||||||
inline SPROUT_CONSTEXPR typename sprout::container_traits<Container>::const_iterator begin(Container const& cont) {
|
inline SPROUT_CONSTEXPR typename sprout::container_traits<Container>::const_iterator
|
||||||
|
begin(Container const& cont) {
|
||||||
return cont.begin();
|
return cont.begin();
|
||||||
}
|
}
|
||||||
template<typename T, std::size_t N>
|
template<typename T, std::size_t N>
|
||||||
inline SPROUT_CONSTEXPR typename sprout::container_traits<T const[N]>::const_iterator begin(T const (& arr)[N]) {
|
inline SPROUT_CONSTEXPR typename sprout::container_traits<T const[N]>::const_iterator
|
||||||
|
begin(T const (& arr)[N]) {
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,11 +35,13 @@ namespace sprout {
|
||||||
// cbegin
|
// cbegin
|
||||||
//
|
//
|
||||||
template<typename Container>
|
template<typename Container>
|
||||||
inline SPROUT_CONSTEXPR typename sprout::container_traits<Container>::const_iterator cbegin(Container const& cont) {
|
inline SPROUT_CONSTEXPR typename sprout::container_traits<Container>::const_iterator
|
||||||
|
cbegin(Container const& cont) {
|
||||||
return cont.begin();
|
return cont.begin();
|
||||||
}
|
}
|
||||||
template<typename T, std::size_t N>
|
template<typename T, std::size_t N>
|
||||||
inline SPROUT_CONSTEXPR typename sprout::container_traits<T const[N]>::const_iterator cbegin(T const (& arr)[N]) {
|
inline SPROUT_CONSTEXPR typename sprout::container_traits<T const[N]>::const_iterator
|
||||||
|
cbegin(T const (& arr)[N]) {
|
||||||
return arr;
|
return arr;
|
||||||
}
|
}
|
||||||
} // namespace sprout
|
} // namespace sprout
|
||||||
|
|
|
@ -10,20 +10,24 @@ namespace sprout {
|
||||||
// end
|
// end
|
||||||
//
|
//
|
||||||
template<typename Container>
|
template<typename Container>
|
||||||
inline typename sprout::container_traits<Container>::iterator end(Container& cont) {
|
inline typename sprout::container_traits<Container>::iterator
|
||||||
|
end(Container& cont) {
|
||||||
return cont.end();
|
return cont.end();
|
||||||
}
|
}
|
||||||
template<typename T, std::size_t N>
|
template<typename T, std::size_t N>
|
||||||
inline typename sprout::container_traits<T[N]>::iterator end(T (& arr)[N]) {
|
inline typename sprout::container_traits<T[N]>::iterator
|
||||||
|
end(T (& arr)[N]) {
|
||||||
return arr + N;
|
return arr + N;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Container>
|
template<typename Container>
|
||||||
inline SPROUT_CONSTEXPR typename sprout::container_traits<Container>::const_iterator end(Container const& cont) {
|
inline SPROUT_CONSTEXPR typename sprout::container_traits<Container>::const_iterator
|
||||||
|
end(Container const& cont) {
|
||||||
return cont.end();
|
return cont.end();
|
||||||
}
|
}
|
||||||
template<typename T, std::size_t N>
|
template<typename T, std::size_t N>
|
||||||
inline SPROUT_CONSTEXPR typename sprout::container_traits<T const[N]>::const_iterator end(T const (& arr)[N]) {
|
inline SPROUT_CONSTEXPR typename sprout::container_traits<T const[N]>::const_iterator
|
||||||
|
end(T const (& arr)[N]) {
|
||||||
return arr + N;
|
return arr + N;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,11 +35,13 @@ namespace sprout {
|
||||||
// cend
|
// cend
|
||||||
//
|
//
|
||||||
template<typename Container>
|
template<typename Container>
|
||||||
inline SPROUT_CONSTEXPR typename sprout::container_traits<Container>::const_iterator cend(Container const& cont) {
|
inline SPROUT_CONSTEXPR typename sprout::container_traits<Container>::const_iterator
|
||||||
|
cend(Container const& cont) {
|
||||||
return cont.end();
|
return cont.end();
|
||||||
}
|
}
|
||||||
template<typename T, std::size_t N>
|
template<typename T, std::size_t N>
|
||||||
inline SPROUT_CONSTEXPR typename sprout::container_traits<T const[N]>::const_iterator cend(T const (& arr)[N]) {
|
inline SPROUT_CONSTEXPR typename sprout::container_traits<T const[N]>::const_iterator
|
||||||
|
cend(T const (& arr)[N]) {
|
||||||
return arr + N;
|
return arr + N;
|
||||||
}
|
}
|
||||||
} // namespace sprout
|
} // namespace sprout
|
||||||
|
|
|
@ -85,107 +85,150 @@ namespace sprout {
|
||||||
}
|
}
|
||||||
} // namespace tuples
|
} // namespace tuples
|
||||||
|
|
||||||
namespace tuple_detail {
|
|
||||||
struct not_found_adl_get {};
|
|
||||||
|
|
||||||
template<std::size_t I>
|
|
||||||
sprout::tuple_detail::not_found_adl_get get(...);
|
|
||||||
|
|
||||||
template<std::size_t I, typename T>
|
|
||||||
struct has_std_get_test {
|
|
||||||
public:
|
|
||||||
template<
|
|
||||||
typename U = T,
|
|
||||||
typename = decltype(std::get<I>(std::declval<U>()))
|
|
||||||
>
|
|
||||||
static std::true_type test(int);
|
|
||||||
static std::false_type test(...);
|
|
||||||
};
|
|
||||||
template<std::size_t I, typename T>
|
|
||||||
struct has_std_get
|
|
||||||
: public decltype(sprout::tuple_detail::has_std_get_test<I, T>::test(0))
|
|
||||||
{};
|
|
||||||
|
|
||||||
template<std::size_t I, typename T>
|
|
||||||
struct has_adl_get_test {
|
|
||||||
public:
|
|
||||||
template<
|
|
||||||
typename U = T,
|
|
||||||
typename sprout::enabler_if<
|
|
||||||
!std::is_same<decltype(get<I>(std::declval<U>())), sprout::tuple_detail::not_found_adl_get>::value
|
|
||||||
&& !sprout::tuple_detail::has_std_get<I, T>::value
|
|
||||||
>::type = sprout::enabler
|
|
||||||
>
|
|
||||||
static std::true_type test(int);
|
|
||||||
static std::false_type test(...);
|
|
||||||
};
|
|
||||||
template<std::size_t I, typename T>
|
|
||||||
struct has_adl_get
|
|
||||||
: public decltype(sprout::tuple_detail::has_adl_get_test<I, T>::test(0))
|
|
||||||
{};
|
|
||||||
|
|
||||||
template<std::size_t I, typename T, typename = void>
|
|
||||||
struct noexcept_get;
|
|
||||||
template<std::size_t I, typename T>
|
|
||||||
struct noexcept_get<I, T, typename std::enable_if<sprout::tuple_detail::has_adl_get<I, T>::value>::type>
|
|
||||||
: public std::integral_constant<bool, SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(get<I>(std::declval<T>()), false)>
|
|
||||||
{};
|
|
||||||
template<std::size_t I, typename T>
|
|
||||||
struct noexcept_get<I, T, typename std::enable_if<sprout::tuple_detail::has_std_get<I, T>::value>::type>
|
|
||||||
: public std::integral_constant<bool, SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(std::get<I>(std::declval<T>()), false)>
|
|
||||||
{};
|
|
||||||
|
|
||||||
template<std::size_t I, typename T, typename = void>
|
|
||||||
struct get_result;
|
|
||||||
template<std::size_t I, typename T>
|
|
||||||
struct get_result<I, T, typename std::enable_if<sprout::tuple_detail::has_adl_get<I, T>::value>::type> {
|
|
||||||
public:
|
|
||||||
typedef decltype(get<I>(std::declval<T>())) type;
|
|
||||||
};
|
|
||||||
template<std::size_t I, typename T>
|
|
||||||
struct get_result<I, T, typename std::enable_if<sprout::tuple_detail::has_std_get<I, T>::value>::type> {
|
|
||||||
public:
|
|
||||||
typedef decltype(std::get<I>(std::declval<T>())) type;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<
|
|
||||||
std::size_t I, typename T,
|
|
||||||
typename sprout::enabler_if<sprout::tuple_detail::has_adl_get<I, T>::value>::type = sprout::enabler
|
|
||||||
>
|
|
||||||
inline SPROUT_CONSTEXPR typename sprout::tuple_detail::get_result<I, T>::type
|
|
||||||
get_impl(T&& t)
|
|
||||||
SPROUT_NOEXCEPT_EXPR((sprout::tuple_detail::noexcept_get<I, T>::value))
|
|
||||||
{
|
|
||||||
return get<I>(sprout::forward<T>(t));
|
|
||||||
}
|
|
||||||
template<
|
|
||||||
std::size_t I, typename T,
|
|
||||||
typename sprout::enabler_if<sprout::tuple_detail::has_std_get<I, T>::value>::type = sprout::enabler
|
|
||||||
>
|
|
||||||
inline SPROUT_CONSTEXPR typename sprout::tuple_detail::get_result<I, T>::type
|
|
||||||
get_impl(T&& t)
|
|
||||||
SPROUT_NOEXCEPT_EXPR((sprout::tuple_detail::noexcept_get<I, T>::value))
|
|
||||||
{
|
|
||||||
return std::get<I>(sprout::forward<T>(t));
|
|
||||||
}
|
|
||||||
} // namespace tuple_detail
|
|
||||||
|
|
||||||
namespace tuples {
|
|
||||||
//
|
|
||||||
// get
|
|
||||||
//
|
|
||||||
template<std::size_t I, typename T>
|
|
||||||
inline SPROUT_CONSTEXPR typename sprout::tuple_detail::get_result<I, T>::type
|
|
||||||
get(T&& t)
|
|
||||||
SPROUT_NOEXCEPT_EXPR((sprout::tuple_detail::noexcept_get<I, T>::value))
|
|
||||||
{
|
|
||||||
return sprout::tuple_detail::get_impl<I>(sprout::forward<T>(t));
|
|
||||||
}
|
|
||||||
} // namespace tuples
|
|
||||||
|
|
||||||
using sprout::tuples::tuple_size;
|
using sprout::tuples::tuple_size;
|
||||||
using sprout::tuples::tuple_element;
|
using sprout::tuples::tuple_element;
|
||||||
using sprout::tuples::get;
|
using sprout::tuples::get;
|
||||||
} // namespace sprout
|
} // namespace sprout
|
||||||
|
|
||||||
|
namespace sprout_tuple_detail {
|
||||||
|
struct not_found_adl_get {};
|
||||||
|
|
||||||
|
template<std::size_t I>
|
||||||
|
sprout_tuple_detail::not_found_adl_get get(...);
|
||||||
|
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct has_adl_get_test {
|
||||||
|
public:
|
||||||
|
template<
|
||||||
|
typename U = T,
|
||||||
|
typename sprout::enabler_if<
|
||||||
|
!std::is_same<decltype(get<I>(std::declval<U>())), sprout_tuple_detail::not_found_adl_get>::value
|
||||||
|
>::type = sprout::enabler
|
||||||
|
>
|
||||||
|
static std::true_type test(int);
|
||||||
|
static std::false_type test(...);
|
||||||
|
};
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct has_adl_get
|
||||||
|
: public decltype(sprout_tuple_detail::has_adl_get_test<I, T>::test(0))
|
||||||
|
{};
|
||||||
|
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct has_std_get_test {
|
||||||
|
public:
|
||||||
|
template<
|
||||||
|
typename U = T,
|
||||||
|
typename = decltype(std::get<I>(std::declval<U>()))
|
||||||
|
>
|
||||||
|
static std::true_type test(int);
|
||||||
|
static std::false_type test(...);
|
||||||
|
};
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct has_std_get
|
||||||
|
: public decltype(sprout_tuple_detail::has_std_get_test<I, T>::test(0))
|
||||||
|
{};
|
||||||
|
|
||||||
|
template<std::size_t I, typename T, typename Enable = void>
|
||||||
|
struct select_adl_get;
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct select_adl_get<
|
||||||
|
I, T,
|
||||||
|
typename std::enable_if<sprout_tuple_detail::has_adl_get<I, T>::value>::type
|
||||||
|
>
|
||||||
|
: public std::true_type
|
||||||
|
{};
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct select_adl_get<
|
||||||
|
I, T,
|
||||||
|
typename std::enable_if<!sprout_tuple_detail::has_adl_get<I, T>::value>::type
|
||||||
|
>
|
||||||
|
: public std::false_type
|
||||||
|
{};
|
||||||
|
|
||||||
|
template<std::size_t I, typename T, typename Enable = void>
|
||||||
|
struct select_std_get;
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct select_std_get<
|
||||||
|
I, T,
|
||||||
|
typename std::enable_if<
|
||||||
|
sprout_tuple_detail::has_std_get<I, T>::value
|
||||||
|
&& !sprout_tuple_detail::has_adl_get<I, T>::value
|
||||||
|
>::type
|
||||||
|
>
|
||||||
|
: public std::true_type
|
||||||
|
{};
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct select_std_get<
|
||||||
|
I, T,
|
||||||
|
typename std::enable_if<!(
|
||||||
|
sprout_tuple_detail::has_std_get<I, T>::value
|
||||||
|
&& !sprout_tuple_detail::has_adl_get<I, T>::value
|
||||||
|
)>::type
|
||||||
|
>
|
||||||
|
: public std::false_type
|
||||||
|
{};
|
||||||
|
|
||||||
|
template<std::size_t I, typename T, typename = void>
|
||||||
|
struct noexcept_get;
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct noexcept_get<I, T, typename std::enable_if<sprout_tuple_detail::select_adl_get<I, T>::value>::type>
|
||||||
|
: public std::integral_constant<bool, SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(get<I>(std::declval<T>()), false)>
|
||||||
|
{};
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct noexcept_get<I, T, typename std::enable_if<sprout_tuple_detail::select_std_get<I, T>::value>::type>
|
||||||
|
: public std::integral_constant<bool, SPROUT_NOEXCEPT_EXPR_OR_DEFAULT(std::get<I>(std::declval<T>()), false)>
|
||||||
|
{};
|
||||||
|
|
||||||
|
template<std::size_t I, typename T, typename = void>
|
||||||
|
struct get_result;
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct get_result<I, T, typename std::enable_if<sprout_tuple_detail::select_adl_get<I, T>::value>::type> {
|
||||||
|
public:
|
||||||
|
typedef decltype(get<I>(std::declval<T>())) type;
|
||||||
|
};
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
struct get_result<I, T, typename std::enable_if<sprout_tuple_detail::select_std_get<I, T>::value>::type> {
|
||||||
|
public:
|
||||||
|
typedef decltype(std::get<I>(std::declval<T>())) type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<
|
||||||
|
std::size_t I, typename T,
|
||||||
|
typename sprout::enabler_if<sprout_tuple_detail::select_adl_get<I, T>::value>::type = sprout::enabler
|
||||||
|
>
|
||||||
|
inline SPROUT_CONSTEXPR typename sprout_tuple_detail::get_result<I, T>::type
|
||||||
|
get_impl(T&& t)
|
||||||
|
SPROUT_NOEXCEPT_EXPR((sprout_tuple_detail::noexcept_get<I, T>::value))
|
||||||
|
{
|
||||||
|
return get<I>(sprout::forward<T>(t));
|
||||||
|
}
|
||||||
|
template<
|
||||||
|
std::size_t I, typename T,
|
||||||
|
typename sprout::enabler_if<sprout_tuple_detail::select_std_get<I, T>::value>::type = sprout::enabler
|
||||||
|
>
|
||||||
|
inline SPROUT_CONSTEXPR typename sprout_tuple_detail::get_result<I, T>::type
|
||||||
|
get_impl(T&& t)
|
||||||
|
SPROUT_NOEXCEPT_EXPR((sprout_tuple_detail::noexcept_get<I, T>::value))
|
||||||
|
{
|
||||||
|
return std::get<I>(sprout::forward<T>(t));
|
||||||
|
}
|
||||||
|
} // namespace sprout_tuple_detail
|
||||||
|
|
||||||
|
namespace sprout {
|
||||||
|
namespace tuples {
|
||||||
|
//
|
||||||
|
// get
|
||||||
|
//
|
||||||
|
template<std::size_t I, typename T>
|
||||||
|
inline SPROUT_CONSTEXPR typename sprout_tuple_detail::get_result<I, T>::type
|
||||||
|
get(T&& t)
|
||||||
|
SPROUT_NOEXCEPT_EXPR((sprout_tuple_detail::noexcept_get<I, T>::value))
|
||||||
|
{
|
||||||
|
return sprout_tuple_detail::get_impl<I>(sprout::forward<T>(t));
|
||||||
|
}
|
||||||
|
} // namespace tuples
|
||||||
|
|
||||||
|
using sprout::tuples::get;
|
||||||
|
} // namespace sprout
|
||||||
|
|
||||||
#endif // #ifndef SPROUT_TUPLE_TUPLE_GET_HPP
|
#endif // #ifndef SPROUT_TUPLE_TUPLE_GET_HPP
|
||||||
|
|
Loading…
Reference in a new issue