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/
|
||||
|
||||
|
||||
|
||||
*インストール (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.)
|
||||
|
||||
|
||||
|
||||
*主なコンテンツ (Main contents)
|
||||
* コンテンツ (contents)
|
||||
|
||||
constexpr コンテナ (Containers)
|
||||
sprout/array.hpp
|
||||
sprout/string.hpp
|
||||
- コンテナとデータ構造 (Containers and Data structures)
|
||||
-- sprout/array.hpp - std::array 互換の固定長コンテナ
|
||||
-- sprout/string.hpp - 固定長バッファの文字列クラス
|
||||
-- sprout/tuple.hpp - std::tuple 互換のタプル
|
||||
-- sprout/variant.hpp - バリアント
|
||||
|
||||
constexpr タプル (Tuples)
|
||||
sprout/tuple.hpp
|
||||
- アルゴリズム (Algorithms)
|
||||
-- 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)
|
||||
sprout/variant.hpp
|
||||
- コンテナサポート (Container supports)
|
||||
-- sprout/sub_array.hpp - 切り出された部分コンテナ
|
||||
-- sprout/pit.hpp - 処理結果のコンテナを返す関数に与えるダミーコンテナ &color(red,white){ ← new!};
|
||||
-- sprout/operation.hpp - コンテナを変更する操作
|
||||
-- sprout/container.hpp - コンテナ特性を定義するトレイトと関数
|
||||
|
||||
constexpr アルゴリズム (Algorithms)
|
||||
sprout/algorithm.hpp
|
||||
sprout/numeric.hpp
|
||||
- 関数オブジェクト (Function Objects)
|
||||
-- sprout/functional.hpp - STL 互換の関数オブジェクトとハッシュ関数
|
||||
|
||||
constexpr 範囲アルゴリズム (Range algorithms)
|
||||
sprout/range/algorithm.hpp
|
||||
sprout/range/numeric.hpp
|
||||
- イテレータ (Iterators)
|
||||
-- sprout/iterator.hpp - STL 互換のイテレータと、いくつかの定義済みイテレータ
|
||||
|
||||
constexpr Rangeアダプタ (Range adaptors)
|
||||
sprout/range/adaptor.hpp
|
||||
- 数学 (Mathematics)
|
||||
-- sprout/math/functions.hpp - 数学関数
|
||||
-- sprout/random.hpp - 乱数
|
||||
-- sprout/complex.hpp - 複素数
|
||||
-- sprout/rational.hpp - 有理数
|
||||
|
||||
constexpr コンテナ操作 (Container operations)
|
||||
sprout/operation.hpp
|
||||
- テンプレートメタプログラミング (Template Metaprogramming)
|
||||
-- sprout/index_tuple.hpp - IndexTuple イディオム
|
||||
-- sprout/type_traits.hpp - 型特性
|
||||
-- sprout/type.hpp - 型リスト
|
||||
|
||||
constexpr 乱数 (Random numbers)
|
||||
sprout/random.hpp
|
||||
sprout/random/unique_seed.hpp
|
||||
- プリプロセッサメタプログラミング (Preprocessor Metaprogramming)
|
||||
-- /sprout/preprocessor.hpp - プリプロセッサメタプログラミングツール
|
||||
|
||||
constexpr 数学関数 (Mathematical functions)
|
||||
sprout/math/functions.hpp
|
||||
sprout/math/common_factor.hpp
|
||||
- ドメイン固有 (Domain specific)
|
||||
-- sprout/uuid.hpp - UUID
|
||||
-- sprout/checksum/sha1.hpp - SHA-1
|
||||
|
||||
constexpr 複素数/有理数 (Complex numbers, Rational numbers)
|
||||
sprout/complex.hpp
|
||||
sprout/rational.hpp
|
||||
- 構文解析 (Parsing)
|
||||
-- sprout/weed.hpp - Boost.Spirit.Qi ライクなコンパイル時パーサコンビネータ
|
||||
|
||||
constexpr 関数オブジェクト (Functors)
|
||||
sprout/functional.hpp
|
||||
- レイトレーシング (Ray tracing)
|
||||
-- sprout/darkroom.hpp - コンパイル時レイトレーサ
|
||||
|
||||
constexpr ハッシュ関数 (Hash functions)
|
||||
sprout/checksum/sha1.hpp
|
||||
sprout/functional/hash.hpp
|
||||
- その他 (Miscellaneous)
|
||||
-- sprout/utility.hpp - <utility> 互換の機能と、雑多なユーティリティ
|
||||
-- sprout/bit.hpp - ビット操作
|
||||
|
||||
constexpr UUID (UUID)
|
||||
sprout/uuid.hpp
|
||||
|
||||
型リスト (Type lists)
|
||||
sprout/type.hpp
|
||||
|
||||
コンテナアダプタ (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
|
||||
- C互換 (C-compatible)
|
||||
-- sprout/cstdlib.hpp - <cstdlib> 互換の機能
|
||||
-- sprout/cstring.hpp - <cstring> 互換の機能
|
||||
-- sprout/cwchar.hpp - <cwchar> 互換の機能
|
||||
-- sprout/cctype.hpp - <cctype> 互換の機能
|
||||
-- sprout/cinttypes.hpp - <cinttypes> 互換の機能
|
||||
|
||||
|
||||
|
||||
*コンフィグ用ユーザマクロ (User macros for configuration)
|
||||
* コンフィグ用ユーザマクロ (User macros for configuration)
|
||||
|
||||
#define SPROUT_CONFIG_DISABLE_CONSTEXPR
|
||||
このマクロが定義されているとき、関数は constexpr 指定されない。
|
||||
|
@ -155,7 +152,7 @@ https://github.com/sscrisk/CEL---ConstExpr-Library
|
|||
|
||||
|
||||
|
||||
*作者 (Author)
|
||||
* 作者 (Author)
|
||||
|
||||
Bolero MURAKAMI
|
||||
Blog: http://d.hatena.ne.jp/boleros/
|
||||
|
@ -164,7 +161,7 @@ Mail: contact-lib@boleros.x0.com
|
|||
|
||||
|
||||
|
||||
*著作権等 (Copyrights)
|
||||
* 著作権等 (Copyrights)
|
||||
|
||||
このライブラリは Boost Software License の元で公開されています。
|
||||
|
||||
|
|
|
@ -10,20 +10,24 @@ namespace sprout {
|
|||
// begin
|
||||
//
|
||||
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();
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -31,11 +35,13 @@ namespace sprout {
|
|||
// cbegin
|
||||
//
|
||||
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();
|
||||
}
|
||||
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;
|
||||
}
|
||||
} // namespace sprout
|
||||
|
|
|
@ -10,20 +10,24 @@ namespace sprout {
|
|||
// end
|
||||
//
|
||||
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();
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -31,11 +35,13 @@ namespace sprout {
|
|||
// cend
|
||||
//
|
||||
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();
|
||||
}
|
||||
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;
|
||||
}
|
||||
} // namespace sprout
|
||||
|
|
|
@ -85,107 +85,150 @@ namespace sprout {
|
|||
}
|
||||
} // 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_element;
|
||||
using sprout::tuples::get;
|
||||
} // 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
|
||||
|
|
Loading…
Reference in a new issue