fix README

This commit is contained in:
bolero-MURAKAMI 2012-07-21 12:12:11 +09:00
parent 196aa8dfbd
commit cdabf2a7f3
4 changed files with 223 additions and 171 deletions

119
README
View file

@ -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 の元で公開されています。

View file

@ -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

View file

@ -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

View file

@ -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