mirror of
https://github.com/bolero-MURAKAMI/Sprout.git
synced 2025-07-04 14:14:09 +00:00
add logic::tribool
This commit is contained in:
parent
33c17736fa
commit
1ef528d204
11 changed files with 478 additions and 18 deletions
2
README
2
README
|
@ -167,6 +167,8 @@ https://github.com/sscrisk/CEL---ConstExpr-Library
|
||||||
* 作者 (Author)
|
* 作者 (Author)
|
||||||
|
|
||||||
Bolero MURAKAMI
|
Bolero MURAKAMI
|
||||||
|
|
||||||
|
Website: http://www.boleros.x0.com/
|
||||||
Twitter: https://twitter.com/bolero_murakami
|
Twitter: https://twitter.com/bolero_murakami
|
||||||
Facebook: http://www.facebook.com/genya.murakami
|
Facebook: http://www.facebook.com/genya.murakami
|
||||||
Blog: http://d.hatena.ne.jp/boleros/
|
Blog: http://d.hatena.ne.jp/boleros/
|
||||||
|
|
7
sprout/logic.hpp
Normal file
7
sprout/logic.hpp
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef SPROUT_LOGIC_HPP
|
||||||
|
#define SPROUT_LOGIC_HPP
|
||||||
|
|
||||||
|
#include <sprout/config.hpp>
|
||||||
|
#include <sprout/logic/tribool.hpp>
|
||||||
|
|
||||||
|
#endif // #ifndef SPROUT_LOGIC_HPP
|
9
sprout/logic/tribool.hpp
Normal file
9
sprout/logic/tribool.hpp
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#ifndef SPROUT_LOGIC_TRIBOOL_HPP
|
||||||
|
#define SPROUT_LOGIC_TRIBOOL_HPP
|
||||||
|
|
||||||
|
#include <sprout/config.hpp>
|
||||||
|
#include <sprout/logic/tribool/tribool_fwd.hpp>
|
||||||
|
#include <sprout/logic/tribool/tribool.hpp>
|
||||||
|
#include <sprout/logic/tribool/io.hpp>
|
||||||
|
|
||||||
|
#endif // #ifndef SPROUT_LOGIC_TRIBOOL_HPP
|
207
sprout/logic/tribool/io.hpp
Normal file
207
sprout/logic/tribool/io.hpp
Normal file
|
@ -0,0 +1,207 @@
|
||||||
|
#ifndef SPROUT_LOGIC_TRIBOOL_TRIBOOL_IO_HPP
|
||||||
|
#define SPROUT_LOGIC_TRIBOOL_TRIBOOL_IO_HPP
|
||||||
|
|
||||||
|
#include <locale>
|
||||||
|
#include <string>
|
||||||
|
#include <iosfwd>
|
||||||
|
#include <ios>
|
||||||
|
#include <sprout/config.hpp>
|
||||||
|
#include <sprout/utility/noncopyable.hpp>
|
||||||
|
#include <sprout/logic/tribool/tribool.hpp>
|
||||||
|
|
||||||
|
namespace sprout {
|
||||||
|
namespace logic {
|
||||||
|
//
|
||||||
|
// get_default_indeterminate_name
|
||||||
|
//
|
||||||
|
template<typename Char>
|
||||||
|
inline std::basic_string<Char>
|
||||||
|
get_default_indeterminate_name();
|
||||||
|
template<>
|
||||||
|
inline std::basic_string<char>
|
||||||
|
get_default_indeterminate_name<char>() {
|
||||||
|
return "indeterminate";
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
inline std::basic_string<wchar_t>
|
||||||
|
get_default_indeterminate_name<wchar_t>() {
|
||||||
|
return L"indeterminate";
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
inline std::basic_string<char16_t>
|
||||||
|
get_default_indeterminate_name<char16_t>() {
|
||||||
|
return u"indeterminate";
|
||||||
|
}
|
||||||
|
template<>
|
||||||
|
inline std::basic_string<char32_t>
|
||||||
|
get_default_indeterminate_name<char32_t>() {
|
||||||
|
return U"indeterminate";
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// indeterminate_name
|
||||||
|
//
|
||||||
|
template<typename Char>
|
||||||
|
class indeterminate_name
|
||||||
|
: public std::locale::facet
|
||||||
|
, private sprout::noncopyable
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef Char char_type;
|
||||||
|
typedef std::basic_string<char_type> string_type;
|
||||||
|
public:
|
||||||
|
static std::locale::id id;
|
||||||
|
private:
|
||||||
|
string_type name_;
|
||||||
|
public:
|
||||||
|
indeterminate_name()
|
||||||
|
: name_(sprout::logic::get_default_indeterminate_name<char_type>())
|
||||||
|
{}
|
||||||
|
explicit indeterminate_name(string_type const& initial_name)
|
||||||
|
: name_(initial_name)
|
||||||
|
{}
|
||||||
|
string_type name() const {
|
||||||
|
return name_;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
template<typename Char>
|
||||||
|
std::locale::id sprout::logic::indeterminate_name<Char>::id;
|
||||||
|
|
||||||
|
//
|
||||||
|
// operator<<
|
||||||
|
//
|
||||||
|
template<typename Char, typename Traits>
|
||||||
|
inline std::basic_ostream<Char, Traits>&
|
||||||
|
operator<<(std::basic_ostream<Char, Traits>& lhs, sprout::logic::tribool rhs) {
|
||||||
|
if (!sprout::logic::indeterminate(rhs)) {
|
||||||
|
lhs << static_cast<bool>(rhs);
|
||||||
|
} else {
|
||||||
|
typename std::basic_ostream<Char, Traits>::sentry cerberus(lhs);
|
||||||
|
if (cerberus) {
|
||||||
|
if (lhs.flags() & std::ios_base::boolalpha) {
|
||||||
|
if (std::has_facet<sprout::logic::indeterminate_name<Char> >(lhs.getloc())) {
|
||||||
|
indeterminate_name<Char> const& facet
|
||||||
|
= std::use_facet<sprout::logic::indeterminate_name<Char> >(lhs.getloc())
|
||||||
|
;
|
||||||
|
lhs << facet.name();
|
||||||
|
} else {
|
||||||
|
lhs << sprout::logic::get_default_indeterminate_name<Char>();
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lhs << 2;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lhs;
|
||||||
|
}
|
||||||
|
template<typename Char, typename Traits>
|
||||||
|
inline std::basic_ostream<Char, Traits>&
|
||||||
|
operator<<(std::basic_ostream<Char, Traits>& lhs, sprout::logic::indeterminate_keyword_t) {
|
||||||
|
return lhs << sprout::logic::tribool(indeterminate);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// operator>>
|
||||||
|
//
|
||||||
|
template<typename Char, typename Traits>
|
||||||
|
inline std::basic_istream<Char, Traits>&
|
||||||
|
operator>>(std::basic_istream<Char, Traits>& lhs, sprout::logic::tribool& rhs) {
|
||||||
|
if (lhs.flags() & std::ios_base::boolalpha) {
|
||||||
|
typename std::basic_istream<Char, Traits>::sentry cerberus(lhs);
|
||||||
|
if (cerberus) {
|
||||||
|
typedef std::basic_string<Char> string_type;
|
||||||
|
const std::numpunct<Char>& numpunct_facet =
|
||||||
|
std::use_facet<std::numpunct<Char> >(lhs.getloc())
|
||||||
|
;
|
||||||
|
string_type falsename = numpunct_facet.falsename();
|
||||||
|
string_type truename = numpunct_facet.truename();
|
||||||
|
string_type othername = std::has_facet<sprout::logic::indeterminate_name<Char> >(lhs.getloc())
|
||||||
|
? std::use_facet<indeterminate_name<Char> >(lhs.getloc()).name()
|
||||||
|
: sprout::logic::get_default_indeterminate_name<Char>()
|
||||||
|
;
|
||||||
|
typename string_type::size_type pos = 0;
|
||||||
|
bool falsename_ok = true;
|
||||||
|
bool truename_ok = true;
|
||||||
|
bool othername_ok = true;
|
||||||
|
while (falsename_ok && pos < falsename.size()
|
||||||
|
|| truename_ok && pos < truename.size()
|
||||||
|
|| othername_ok && pos < othername.size()
|
||||||
|
)
|
||||||
|
{
|
||||||
|
typename Traits::int_type c = lhs.get();
|
||||||
|
if (c == Traits::eof()) {
|
||||||
|
return lhs;
|
||||||
|
}
|
||||||
|
bool matched = false;
|
||||||
|
if (falsename_ok && pos < falsename.size()) {
|
||||||
|
if (Traits::eq(Traits::to_char_type(c), falsename[pos])) {
|
||||||
|
matched = true;
|
||||||
|
} else {
|
||||||
|
falsename_ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (truename_ok && pos < truename.size()) {
|
||||||
|
if (Traits::eq(Traits::to_char_type(c), truename[pos])) {
|
||||||
|
matched = true;
|
||||||
|
} else {
|
||||||
|
truename_ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (othername_ok && pos < othername.size()) {
|
||||||
|
if (Traits::eq(Traits::to_char_type(c), othername[pos])) {
|
||||||
|
matched = true;
|
||||||
|
} else {
|
||||||
|
othername_ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (matched) {
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
if (pos > falsename.size()) {
|
||||||
|
falsename_ok = false;
|
||||||
|
}
|
||||||
|
if (pos > truename.size()) {
|
||||||
|
truename_ok = false;
|
||||||
|
}
|
||||||
|
if (pos > othername.size()) {
|
||||||
|
othername_ok = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pos == 0) {
|
||||||
|
lhs.setstate(std::ios_base::failbit);
|
||||||
|
} else {
|
||||||
|
if (falsename_ok) {
|
||||||
|
rhs = false;
|
||||||
|
} else if (truename_ok) {
|
||||||
|
rhs = true;
|
||||||
|
} else if (othername_ok) {
|
||||||
|
rhs = indeterminate;
|
||||||
|
} else {
|
||||||
|
lhs.setstate(std::ios_base::failbit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
long value;
|
||||||
|
if (lhs >> value) {
|
||||||
|
switch (value) {
|
||||||
|
case 0:
|
||||||
|
rhs = false;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
rhs = true;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
rhs = indeterminate;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
lhs.setstate(std::ios_base::failbit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lhs;
|
||||||
|
}
|
||||||
|
} // namespace logic
|
||||||
|
} // namespace sprout
|
||||||
|
|
||||||
|
#endif // #ifndef SPROUT_LOGIC_TRIBOOL_TRIBOOL_IO_HPP
|
191
sprout/logic/tribool/tribool.hpp
Normal file
191
sprout/logic/tribool/tribool.hpp
Normal file
|
@ -0,0 +1,191 @@
|
||||||
|
#ifndef SPROUT_LOGIC_TRIBOOL_TRIBOOL_HPP
|
||||||
|
#define SPROUT_LOGIC_TRIBOOL_TRIBOOL_HPP
|
||||||
|
|
||||||
|
#include <sprout/config.hpp>
|
||||||
|
#include <sprout/logic/tribool/tribool_fwd.hpp>
|
||||||
|
|
||||||
|
namespace sprout {
|
||||||
|
namespace logic {
|
||||||
|
namespace detail {
|
||||||
|
struct indeterminate_t {};
|
||||||
|
} // namespace detail
|
||||||
|
|
||||||
|
//
|
||||||
|
// indeterminate_keyword_t
|
||||||
|
//
|
||||||
|
typedef bool (*indeterminate_keyword_t)(sprout::logic::tribool, sprout::logic::detail::indeterminate_t);
|
||||||
|
|
||||||
|
//
|
||||||
|
// tribool
|
||||||
|
//
|
||||||
|
class tribool {
|
||||||
|
private:
|
||||||
|
struct dummy {
|
||||||
|
public:
|
||||||
|
void nonnull() {}
|
||||||
|
};
|
||||||
|
typedef void (dummy::*safe_bool)();
|
||||||
|
public:
|
||||||
|
enum value_t {
|
||||||
|
false_value,
|
||||||
|
true_value,
|
||||||
|
indeterminate_value
|
||||||
|
};
|
||||||
|
public:
|
||||||
|
value_t value;
|
||||||
|
public:
|
||||||
|
SPROUT_CONSTEXPR tribool()
|
||||||
|
: value(false_value)
|
||||||
|
{}
|
||||||
|
SPROUT_CONSTEXPR tribool(bool initial_value)
|
||||||
|
: value(initial_value? true_value : false_value)
|
||||||
|
{}
|
||||||
|
SPROUT_CONSTEXPR tribool(sprout::logic::indeterminate_keyword_t)
|
||||||
|
: value(indeterminate_value)
|
||||||
|
{}
|
||||||
|
SPROUT_CONSTEXPR operator safe_bool() const {
|
||||||
|
return value == true_value ? &dummy::nonnull : 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
//
|
||||||
|
// indeterminate
|
||||||
|
//
|
||||||
|
inline SPROUT_CONSTEXPR bool
|
||||||
|
indeterminate(sprout::logic::tribool x, sprout::logic::detail::indeterminate_t = sprout::logic::detail::indeterminate_t()) {
|
||||||
|
return x.value == sprout::logic::tribool::indeterminate_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// operator!
|
||||||
|
//
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator!(sprout::logic::tribool x) {
|
||||||
|
return x.value == sprout::logic::tribool::false_value ? sprout::logic::tribool(true)
|
||||||
|
: x.value == sprout::logic::tribool::true_value ? sprout::logic::tribool(false)
|
||||||
|
: sprout::logic::tribool(sprout::logic::indeterminate)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// operator&&
|
||||||
|
//
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator&&(sprout::logic::tribool lhs, sprout::logic::tribool rhs) {
|
||||||
|
return static_cast<bool>(!lhs) || static_cast<bool>(!rhs) ? sprout::logic::tribool(false)
|
||||||
|
: static_cast<bool>(lhs) && static_cast<bool>(rhs) ? sprout::logic::tribool(true)
|
||||||
|
: sprout::logic::tribool(sprout::logic::indeterminate)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator&&(tribool lhs, bool rhs) {
|
||||||
|
return rhs ? lhs : sprout::logic::tribool(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator&&(bool lhs, sprout::logic::tribool rhs) {
|
||||||
|
return lhs ? rhs : sprout::logic::tribool(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator&&(sprout::logic::indeterminate_keyword_t, sprout::logic::tribool lhs) {
|
||||||
|
return !lhs ? sprout::logic::tribool(false) : sprout::logic::tribool(sprout::logic::indeterminate);
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator&&(sprout::logic::tribool lhs, sprout::logic::indeterminate_keyword_t) {
|
||||||
|
return !lhs ? sprout::logic::tribool(false) : sprout::logic::tribool(indeterminate);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// operator||
|
||||||
|
//
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator||(sprout::logic::tribool lhs, sprout::logic::tribool rhs) {
|
||||||
|
return static_cast<bool>(!lhs) && static_cast<bool>(!rhs) ? sprout::logic::tribool(false)
|
||||||
|
: static_cast<bool>(lhs) || static_cast<bool>(rhs) ? sprout::logic::tribool(true)
|
||||||
|
: sprout::logic::tribool(sprout::logic::indeterminate)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator||(sprout::logic::tribool lhs, bool rhs) {
|
||||||
|
return rhs ? sprout::logic::tribool(true) : lhs;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator||(bool lhs, sprout::logic::tribool rhs) {
|
||||||
|
return lhs ? sprout::logic::tribool(true) : rhs;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator||(sprout::logic::indeterminate_keyword_t, sprout::logic::tribool lhs) {
|
||||||
|
return lhs ? sprout::logic::tribool(true) : sprout::logic::tribool(sprout::logic::indeterminate);
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator||(sprout::logic::tribool lhs, sprout::logic::indeterminate_keyword_t) {
|
||||||
|
return lhs ? sprout::logic::tribool(true) : sprout::logic::tribool(sprout::logic::indeterminate);
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// operator==
|
||||||
|
//
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator==(sprout::logic::tribool lhs, sprout::logic::tribool rhs) {
|
||||||
|
return sprout::logic::indeterminate(lhs) || sprout::logic::indeterminate(rhs)
|
||||||
|
? sprout::logic::tribool(sprout::logic::indeterminate)
|
||||||
|
: (lhs && rhs) || (!lhs && !rhs)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator==(sprout::logic::tribool lhs, bool rhs) {
|
||||||
|
return lhs == sprout::logic::tribool(rhs);
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator==(bool lhs, sprout::logic::tribool rhs) {
|
||||||
|
return sprout::logic::tribool(lhs) == rhs;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator==(sprout::logic::indeterminate_keyword_t, sprout::logic::tribool lhs) {
|
||||||
|
return sprout::logic::tribool(sprout::logic::indeterminate) == lhs;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator==(sprout::logic::tribool lhs, sprout::logic::indeterminate_keyword_t) {
|
||||||
|
return sprout::logic::tribool(sprout::logic::indeterminate) == lhs;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// operator!=
|
||||||
|
//
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator!=(sprout::logic::tribool lhs, sprout::logic::tribool rhs) {
|
||||||
|
return sprout::logic::indeterminate(lhs) || sprout::logic::indeterminate(rhs)
|
||||||
|
? sprout::logic::tribool(sprout::logic::indeterminate)
|
||||||
|
: !((lhs && rhs) || (!lhs && !rhs))
|
||||||
|
;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator!=(sprout::logic::tribool lhs, bool rhs) {
|
||||||
|
return lhs != sprout::logic::tribool(rhs);
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator!=(bool lhs, sprout::logic::tribool rhs) {
|
||||||
|
return sprout::logic::tribool(lhs) != rhs;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator!=(sprout::logic::indeterminate_keyword_t, sprout::logic::tribool lhs) {
|
||||||
|
return sprout::logic::tribool(sprout::logic::indeterminate) != lhs;
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::logic::tribool
|
||||||
|
operator!=(sprout::logic::tribool lhs, sprout::logic::indeterminate_keyword_t) {
|
||||||
|
return sprout::logic::tribool(sprout::logic::indeterminate) != lhs;
|
||||||
|
}
|
||||||
|
} // namespace logic
|
||||||
|
|
||||||
|
using sprout::logic::tribool;
|
||||||
|
using sprout::logic::indeterminate;
|
||||||
|
} // namespace sprout
|
||||||
|
|
||||||
|
#define SPROUT_TRIBOOL_THIRD_STATE(NAME) \
|
||||||
|
inline SPROUT_CONSTEXPR bool \
|
||||||
|
NAME(sprout::logic::tribool lhs, sprout::logic::detail::indeterminate_t = sprout::logic::detail::indeterminate_t()) { \
|
||||||
|
return lhs.value == sprout::logic::tribool::indeterminate_value; \
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // #ifndef SPROUT_LOGIC_TRIBOOL_TRIBOOL_HPP
|
15
sprout/logic/tribool/tribool_fwd.hpp
Normal file
15
sprout/logic/tribool/tribool_fwd.hpp
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
#ifndef SPROUT_LOGIC_TRIBOOL_TRIBOOL_FWD_HPP
|
||||||
|
#define SPROUT_LOGIC_TRIBOOL_TRIBOOL_FWD_HPP
|
||||||
|
|
||||||
|
#include <sprout/config.hpp>
|
||||||
|
|
||||||
|
namespace sprout {
|
||||||
|
namespace logic {
|
||||||
|
//
|
||||||
|
// tribool
|
||||||
|
//
|
||||||
|
class tribool;
|
||||||
|
} // namespace logic
|
||||||
|
} // namespace sprout
|
||||||
|
|
||||||
|
#endif // #ifndef SPROUT_LOGIC_TRIBOOL_TRIBOOL_FWD_HPP
|
7
sprout/logic/tribool_fwd.hpp
Normal file
7
sprout/logic/tribool_fwd.hpp
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
#ifndef SPROUT_LOGIC_TRIBOOL_FWD_HPP
|
||||||
|
#define SPROUT_LOGIC_TRIBOOL_FWD_HPP
|
||||||
|
|
||||||
|
#include <sprout/config.hpp>
|
||||||
|
#include <sprout/logic/tribool/tribool_fwd.hpp>
|
||||||
|
|
||||||
|
#endif // #ifndef SPROUT_LOGIC_TRIBOOL_FWD_HPP
|
|
@ -7,6 +7,7 @@
|
||||||
#include <sprout/utility/operation.hpp>
|
#include <sprout/utility/operation.hpp>
|
||||||
#include <sprout/utility/operation_ext.hpp>
|
#include <sprout/utility/operation_ext.hpp>
|
||||||
#include <sprout/utility/enabler_if.hpp>
|
#include <sprout/utility/enabler_if.hpp>
|
||||||
|
#include <sprout/utility/noncopyable.hpp>
|
||||||
#include <sprout/utility/pack.hpp>
|
#include <sprout/utility/pack.hpp>
|
||||||
#include <sprout/utility/value_holder.hpp>
|
#include <sprout/utility/value_holder.hpp>
|
||||||
|
|
||||||
|
|
21
sprout/utility/noncopyable.hpp
Normal file
21
sprout/utility/noncopyable.hpp
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
#ifndef SPROUT_UTILITY_NONCOPYABLE_HPP
|
||||||
|
#define SPROUT_UTILITY_NONCOPYABLE_HPP
|
||||||
|
|
||||||
|
#include <sprout/config.hpp>
|
||||||
|
|
||||||
|
namespace sprout {
|
||||||
|
namespace noncopyable_ {
|
||||||
|
class noncopyable {
|
||||||
|
public:
|
||||||
|
SPROUT_CONSTEXPR noncopyable() = default;
|
||||||
|
noncopyable(noncopyable const&) = delete;
|
||||||
|
noncopyable& operator=(noncopyable const&) = delete;
|
||||||
|
};
|
||||||
|
} // namespace noncopyable_
|
||||||
|
//
|
||||||
|
// noncopyable
|
||||||
|
//
|
||||||
|
typedef sprout::noncopyable_::noncopyable noncopyable;
|
||||||
|
} // namespace sprout
|
||||||
|
|
||||||
|
#endif // #ifndef SPROUT_UTILITY_NONCOPYABLE_HPP
|
|
@ -113,7 +113,8 @@ namespace sprout {
|
||||||
// to_string_of
|
// to_string_of
|
||||||
//
|
//
|
||||||
template<typename Elem, typename Traits = sprout::char_traits<Elem> >
|
template<typename Elem, typename Traits = sprout::char_traits<Elem> >
|
||||||
inline SPROUT_CONSTEXPR sprout::basic_string<Elem, 36, Traits> to_string_of(sprout::uuids::uuid const& u) {
|
inline SPROUT_CONSTEXPR sprout::basic_string<Elem, 36, Traits>
|
||||||
|
to_string_of(sprout::uuids::uuid const& u) {
|
||||||
return sprout::basic_string<Elem, 36, Traits>{
|
return sprout::basic_string<Elem, 36, Traits>{
|
||||||
{
|
{
|
||||||
sprout::uuids::detail::digits<Elem>::table[(u[0] >> 4) & 0x0F],
|
sprout::uuids::detail::digits<Elem>::table[(u[0] >> 4) & 0x0F],
|
||||||
|
@ -158,26 +159,24 @@ namespace sprout {
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
// to_string
|
// to_string
|
||||||
//
|
|
||||||
inline SPROUT_CONSTEXPR sprout::basic_string<char, 36> to_string(sprout::uuids::uuid const& u) {
|
|
||||||
return sprout::uuids::to_string_of<char>(u);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// to_wstring
|
// to_wstring
|
||||||
//
|
|
||||||
inline SPROUT_CONSTEXPR sprout::basic_string<wchar_t, 36> to_wstring(sprout::uuids::uuid const& u) {
|
|
||||||
return sprout::uuids::to_string_of<wchar_t>(u);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// to_u16string
|
// to_u16string
|
||||||
//
|
|
||||||
inline SPROUT_CONSTEXPR sprout::basic_string<char16_t, 36> to_u16string(sprout::uuids::uuid const& u) {
|
|
||||||
return sprout::uuids::to_string_of<char16_t>(u);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// to_u32string
|
// to_u32string
|
||||||
//
|
//
|
||||||
inline SPROUT_CONSTEXPR sprout::basic_string<char32_t, 36> to_u32string(sprout::uuids::uuid const& u) {
|
inline SPROUT_CONSTEXPR sprout::basic_string<char, 36>
|
||||||
|
to_string(sprout::uuids::uuid const& u) {
|
||||||
|
return sprout::uuids::to_string_of<char>(u);
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::basic_string<wchar_t, 36>
|
||||||
|
to_wstring(sprout::uuids::uuid const& u) {
|
||||||
|
return sprout::uuids::to_string_of<wchar_t>(u);
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::basic_string<char16_t, 36>
|
||||||
|
to_u16string(sprout::uuids::uuid const& u) {
|
||||||
|
return sprout::uuids::to_string_of<char16_t>(u);
|
||||||
|
}
|
||||||
|
inline SPROUT_CONSTEXPR sprout::basic_string<char32_t, 36>
|
||||||
|
to_u32string(sprout::uuids::uuid const& u) {
|
||||||
return sprout::uuids::to_string_of<char32_t>(u);
|
return sprout::uuids::to_string_of<char32_t>(u);
|
||||||
}
|
}
|
||||||
} // namespace uuids
|
} // namespace uuids
|
||||||
|
|
|
@ -265,7 +265,8 @@ namespace testspr {
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return first1_ == last1 && first2_ == last2 ? true
|
return first1_ == last1 && first2_ == last2 ? true
|
||||||
: testspr::count(first1, last1, *first1_) != testspr::count(first2, first2 + testspr::distance(first1, last1), *first1_) ? false
|
: testspr::count(first1, last1, *first1_) != testspr::count(first2, first2 + testspr::distance(first1, last1), *first1_)
|
||||||
|
? false
|
||||||
: testspr::detail::is_permutation_impl(first1, last1, first2, last2, first1_ + 1, first2_ + 1)
|
: testspr::detail::is_permutation_impl(first1, last1, first2, last2, first1_ + 1, first2_ + 1)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue