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/
*インストール (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 の元で公開されています。

View file

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

View file

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

View file

@ -85,11 +85,33 @@ namespace sprout {
}
} // namespace tuples
namespace tuple_detail {
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(...);
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 {
@ -103,88 +125,109 @@ namespace sprout {
};
template<std::size_t I, typename T>
struct has_std_get
: public decltype(sprout::tuple_detail::has_std_get_test<I, T>::test(0))
: 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 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
struct select_adl_get<
I, T,
typename std::enable_if<sprout_tuple_detail::has_adl_get<I, T>::value>::type
>
static std::true_type test(int);
static std::false_type test(...);
};
: public std::true_type
{};
template<std::size_t I, typename T>
struct has_adl_get
: public decltype(sprout::tuple_detail::has_adl_get_test<I, T>::test(0))
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::has_adl_get<I, T>::value>::type>
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::has_std_get<I, T>::value>::type>
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::has_adl_get<I, T>::value>::type> {
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::has_std_get<I, T>::value>::type> {
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::has_adl_get<I, T>::value>::type = sprout::enabler
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
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))
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
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
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))
SPROUT_NOEXCEPT_EXPR((sprout_tuple_detail::noexcept_get<I, T>::value))
{
return std::get<I>(sprout::forward<T>(t));
}
} // namespace tuple_detail
} // 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
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))
SPROUT_NOEXCEPT_EXPR((sprout_tuple_detail::noexcept_get<I, T>::value))
{
return sprout::tuple_detail::get_impl<I>(sprout::forward<T>(t));
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