diff --git a/README b/README index be958fc7..5fbcc44b 100644 --- a/README +++ b/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) - にライブラリのディレクトリにパスを通す。 +ディレクトリ /path/to/sprout にパスを通す。 このライブラリはヘッダオンリーで使える。 - (Trough the path to the directory of the library to . + (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 - 互換の機能と、雑多なユーティリティ +-- 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 - 互換の機能 +-- sprout/cstring.hpp - 互換の機能 +-- sprout/cwchar.hpp - 互換の機能 +-- sprout/cctype.hpp - 互換の機能 +-- sprout/cinttypes.hpp - 互換の機能 -*コンフィグ用ユーザマクロ (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 の元で公開されています。 diff --git a/sprout/container/begin.hpp b/sprout/container/begin.hpp index 917d88db..03cc7555 100644 --- a/sprout/container/begin.hpp +++ b/sprout/container/begin.hpp @@ -10,20 +10,24 @@ namespace sprout { // begin // template - inline typename sprout::container_traits::iterator begin(Container& cont) { + inline typename sprout::container_traits::iterator + begin(Container& cont) { return cont.begin(); } template - inline typename sprout::container_traits::iterator begin(T (& arr)[N]) { + inline typename sprout::container_traits::iterator + begin(T (& arr)[N]) { return arr; } template - inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator begin(Container const& cont) { + inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator + begin(Container const& cont) { return cont.begin(); } template - inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator begin(T const (& arr)[N]) { + inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator + begin(T const (& arr)[N]) { return arr; } @@ -31,11 +35,13 @@ namespace sprout { // cbegin // template - inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator cbegin(Container const& cont) { + inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator + cbegin(Container const& cont) { return cont.begin(); } template - inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator cbegin(T const (& arr)[N]) { + inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator + cbegin(T const (& arr)[N]) { return arr; } } // namespace sprout diff --git a/sprout/container/end.hpp b/sprout/container/end.hpp index 9288bbe3..2400399a 100644 --- a/sprout/container/end.hpp +++ b/sprout/container/end.hpp @@ -10,20 +10,24 @@ namespace sprout { // end // template - inline typename sprout::container_traits::iterator end(Container& cont) { + inline typename sprout::container_traits::iterator + end(Container& cont) { return cont.end(); } template - inline typename sprout::container_traits::iterator end(T (& arr)[N]) { + inline typename sprout::container_traits::iterator + end(T (& arr)[N]) { return arr + N; } template - inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator end(Container const& cont) { + inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator + end(Container const& cont) { return cont.end(); } template - inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator end(T const (& arr)[N]) { + inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator + end(T const (& arr)[N]) { return arr + N; } @@ -31,11 +35,13 @@ namespace sprout { // cend // template - inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator cend(Container const& cont) { + inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator + cend(Container const& cont) { return cont.end(); } template - inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator cend(T const (& arr)[N]) { + inline SPROUT_CONSTEXPR typename sprout::container_traits::const_iterator + cend(T const (& arr)[N]) { return arr + N; } } // namespace sprout diff --git a/sprout/tuple/tuple/get.hpp b/sprout/tuple/tuple/get.hpp index 69e304f1..30e0556a 100644 --- a/sprout/tuple/tuple/get.hpp +++ b/sprout/tuple/tuple/get.hpp @@ -85,107 +85,150 @@ namespace sprout { } } // namespace tuples - namespace tuple_detail { - struct not_found_adl_get {}; - - template - sprout::tuple_detail::not_found_adl_get get(...); - - template - struct has_std_get_test { - public: - template< - typename U = T, - typename = decltype(std::get(std::declval())) - > - static std::true_type test(int); - static std::false_type test(...); - }; - template - struct has_std_get - : public decltype(sprout::tuple_detail::has_std_get_test::test(0)) - {}; - - template - struct has_adl_get_test { - public: - template< - typename U = T, - typename sprout::enabler_if< - !std::is_same(std::declval())), sprout::tuple_detail::not_found_adl_get>::value - && !sprout::tuple_detail::has_std_get::value - >::type = sprout::enabler - > - static std::true_type test(int); - static std::false_type test(...); - }; - template - struct has_adl_get - : public decltype(sprout::tuple_detail::has_adl_get_test::test(0)) - {}; - - template - struct noexcept_get; - template - struct noexcept_get::value>::type> - : public std::integral_constant(std::declval()), false)> - {}; - template - struct noexcept_get::value>::type> - : public std::integral_constant(std::declval()), false)> - {}; - - template - struct get_result; - template - struct get_result::value>::type> { - public: - typedef decltype(get(std::declval())) type; - }; - template - struct get_result::value>::type> { - public: - typedef decltype(std::get(std::declval())) type; - }; - - template< - std::size_t I, typename T, - typename sprout::enabler_if::value>::type = sprout::enabler - > - inline SPROUT_CONSTEXPR typename sprout::tuple_detail::get_result::type - get_impl(T&& t) - SPROUT_NOEXCEPT_EXPR((sprout::tuple_detail::noexcept_get::value)) - { - return get(sprout::forward(t)); - } - template< - std::size_t I, typename T, - typename sprout::enabler_if::value>::type = sprout::enabler - > - inline SPROUT_CONSTEXPR typename sprout::tuple_detail::get_result::type - get_impl(T&& t) - SPROUT_NOEXCEPT_EXPR((sprout::tuple_detail::noexcept_get::value)) - { - return std::get(sprout::forward(t)); - } - } // namespace tuple_detail - - namespace tuples { - // - // get - // - template - inline SPROUT_CONSTEXPR typename sprout::tuple_detail::get_result::type - get(T&& t) - SPROUT_NOEXCEPT_EXPR((sprout::tuple_detail::noexcept_get::value)) - { - return sprout::tuple_detail::get_impl(sprout::forward(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 + sprout_tuple_detail::not_found_adl_get get(...); + + template + struct has_adl_get_test { + public: + template< + typename U = T, + typename sprout::enabler_if< + !std::is_same(std::declval())), sprout_tuple_detail::not_found_adl_get>::value + >::type = sprout::enabler + > + static std::true_type test(int); + static std::false_type test(...); + }; + template + struct has_adl_get + : public decltype(sprout_tuple_detail::has_adl_get_test::test(0)) + {}; + + template + struct has_std_get_test { + public: + template< + typename U = T, + typename = decltype(std::get(std::declval())) + > + static std::true_type test(int); + static std::false_type test(...); + }; + template + struct has_std_get + : public decltype(sprout_tuple_detail::has_std_get_test::test(0)) + {}; + + template + struct select_adl_get; + template + struct select_adl_get< + I, T, + typename std::enable_if::value>::type + > + : public std::true_type + {}; + template + struct select_adl_get< + I, T, + typename std::enable_if::value>::type + > + : public std::false_type + {}; + + template + struct select_std_get; + template + struct select_std_get< + I, T, + typename std::enable_if< + sprout_tuple_detail::has_std_get::value + && !sprout_tuple_detail::has_adl_get::value + >::type + > + : public std::true_type + {}; + template + struct select_std_get< + I, T, + typename std::enable_if::value + && !sprout_tuple_detail::has_adl_get::value + )>::type + > + : public std::false_type + {}; + + template + struct noexcept_get; + template + struct noexcept_get::value>::type> + : public std::integral_constant(std::declval()), false)> + {}; + template + struct noexcept_get::value>::type> + : public std::integral_constant(std::declval()), false)> + {}; + + template + struct get_result; + template + struct get_result::value>::type> { + public: + typedef decltype(get(std::declval())) type; + }; + template + struct get_result::value>::type> { + public: + typedef decltype(std::get(std::declval())) type; + }; + + template< + std::size_t I, typename T, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR typename sprout_tuple_detail::get_result::type + get_impl(T&& t) + SPROUT_NOEXCEPT_EXPR((sprout_tuple_detail::noexcept_get::value)) + { + return get(sprout::forward(t)); + } + template< + std::size_t I, typename T, + typename sprout::enabler_if::value>::type = sprout::enabler + > + inline SPROUT_CONSTEXPR typename sprout_tuple_detail::get_result::type + get_impl(T&& t) + SPROUT_NOEXCEPT_EXPR((sprout_tuple_detail::noexcept_get::value)) + { + return std::get(sprout::forward(t)); + } +} // namespace sprout_tuple_detail + +namespace sprout { + namespace tuples { + // + // get + // + template + inline SPROUT_CONSTEXPR typename sprout_tuple_detail::get_result::type + get(T&& t) + SPROUT_NOEXCEPT_EXPR((sprout_tuple_detail::noexcept_get::value)) + { + return sprout_tuple_detail::get_impl(sprout::forward(t)); + } + } // namespace tuples + + using sprout::tuples::get; +} // namespace sprout + #endif // #ifndef SPROUT_TUPLE_TUPLE_GET_HPP