1
0
Fork 0
mirror of https://github.com/bolero-MURAKAMI/Sprout synced 2025-08-03 12:49:50 +00:00

fix string literal table implementations

This commit is contained in:
bolero-MURAKAMI 2014-10-23 17:23:38 +09:00
parent ff3a85cf55
commit 06eaf3f0ec
10 changed files with 220 additions and 503 deletions

View file

@ -12,66 +12,15 @@
#include <sprout/config.hpp>
#include <sprout/array/array.hpp>
#include <sprout/string.hpp>
#include <sprout/detail/literal_def.hpp>
namespace sprout {
namespace uuids {
namespace detail {
template<typename Elem>
struct digits {};
template<>
struct digits<char> {
public:
SPROUT_STATIC_CONSTEXPR sprout::basic_string<char, 22> table
SPROUT_STATIC_CONSTEXPR_DATA_MEMBER_INNER(sprout::to_string("0123456789abcdefABCDEF"))
;
SPROUT_STATIC_CONSTEXPR char dash = '-';
};
SPROUT_CONSTEXPR_OR_CONST sprout::basic_string<char, 22> sprout::uuids::detail::digits<char>::table
SPROUT_STATIC_CONSTEXPR_DATA_MEMBER_OUTER(sprout::to_string("0123456789abcdefABCDEF"))
;
SPROUT_CONSTEXPR_OR_CONST char sprout::uuids::detail::digits<char>::dash;
template<>
struct digits<wchar_t> {
public:
SPROUT_STATIC_CONSTEXPR sprout::basic_string<wchar_t, 22> table
SPROUT_STATIC_CONSTEXPR_DATA_MEMBER_INNER(sprout::to_string(L"0123456789abcdefABCDEF"))
;
SPROUT_STATIC_CONSTEXPR wchar_t dash = L'-';
};
SPROUT_CONSTEXPR_OR_CONST sprout::basic_string<wchar_t, 22> sprout::uuids::detail::digits<wchar_t>::table
SPROUT_STATIC_CONSTEXPR_DATA_MEMBER_OUTER(sprout::to_string(L"0123456789abcdefABCDEF"))
;
SPROUT_CONSTEXPR_OR_CONST wchar_t sprout::uuids::detail::digits<wchar_t>::dash;
#if SPROUT_USE_UNICODE_LITERALS
template<>
struct digits<char16_t> {
public:
SPROUT_STATIC_CONSTEXPR sprout::basic_string<char16_t, 22> table
SPROUT_STATIC_CONSTEXPR_DATA_MEMBER_INNER(sprout::to_string(u"0123456789abcdefABCDEF"))
;
SPROUT_STATIC_CONSTEXPR char16_t dash = u'-';
};
SPROUT_CONSTEXPR_OR_CONST sprout::basic_string<char16_t, 22> sprout::uuids::detail::digits<char16_t>::table
SPROUT_STATIC_CONSTEXPR_DATA_MEMBER_OUTER(sprout::to_string(u"0123456789abcdefABCDEF"))
;
SPROUT_CONSTEXPR_OR_CONST char16_t sprout::uuids::detail::digits<char16_t>::dash;
template<>
struct digits<char32_t> {
public:
SPROUT_STATIC_CONSTEXPR sprout::basic_string<char32_t, 22> table
SPROUT_STATIC_CONSTEXPR_DATA_MEMBER_INNER(sprout::to_string(U"0123456789abcdefABCDEF"))
;
SPROUT_STATIC_CONSTEXPR char32_t dash = U'-';
};
SPROUT_CONSTEXPR_OR_CONST sprout::basic_string<char32_t, 22> sprout::uuids::detail::digits<char32_t>::table
SPROUT_STATIC_CONSTEXPR_DATA_MEMBER_OUTER(sprout::to_string(U"0123456789abcdefABCDEF"))
;
SPROUT_CONSTEXPR_OR_CONST char32_t sprout::uuids::detail::digits<char32_t>::dash;
#endif
SPROUT_LITERAL_STRING_DEF(digits, "0123456789abcdefABCDEF", 22);
SPROUT_LITERAL_CHAR_DEF(dash, '-');
SPROUT_LITERAL_CHAR_DEF(lbrace, '{');
SPROUT_LITERAL_CHAR_DEF(rbrace, '}');
template<typename Dummy>
struct values;

View file

@ -126,42 +126,42 @@ namespace sprout {
typedef sprout::detail::string_construct_access<Elem, 36, Traits> access_type;
return access_type::raw_construct(
36,
sprout::uuids::detail::digits<Elem>::table[(u[0] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[0]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[1] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[1]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[2] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[2]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[3] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[3]) & 0x0F],
sprout::uuids::detail::digits<Elem>::dash,
sprout::uuids::detail::digits<Elem>::table[(u[4] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[4]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[5] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[5]) & 0x0F],
sprout::uuids::detail::digits<Elem>::dash,
sprout::uuids::detail::digits<Elem>::table[(u[6] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[6]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[7] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[7]) & 0x0F],
sprout::uuids::detail::digits<Elem>::dash,
sprout::uuids::detail::digits<Elem>::table[(u[8] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[8]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[9] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[9]) & 0x0F],
sprout::uuids::detail::digits<Elem>::dash,
sprout::uuids::detail::digits<Elem>::table[(u[10] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[10]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[11] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[11]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[12] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[12]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[13] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[13]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[14] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[14]) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[15] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::table[(u[15]) & 0x0F]
sprout::uuids::detail::digits<Elem>::value[(u[0] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[0]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[1] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[1]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[2] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[2]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[3] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[3]) & 0x0F],
sprout::uuids::detail::dash<Elem>::value,
sprout::uuids::detail::digits<Elem>::value[(u[4] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[4]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[5] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[5]) & 0x0F],
sprout::uuids::detail::dash<Elem>::value,
sprout::uuids::detail::digits<Elem>::value[(u[6] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[6]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[7] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[7]) & 0x0F],
sprout::uuids::detail::dash<Elem>::value,
sprout::uuids::detail::digits<Elem>::value[(u[8] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[8]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[9] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[9]) & 0x0F],
sprout::uuids::detail::dash<Elem>::value,
sprout::uuids::detail::digits<Elem>::value[(u[10] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[10]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[11] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[11]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[12] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[12]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[13] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[13]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[14] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[14]) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[15] >> 4) & 0x0F],
sprout::uuids::detail::digits<Elem>::value[(u[15]) & 0x0F]
);
}
//

View file

@ -60,50 +60,30 @@ namespace sprout {
SPROUT_CONSTEXPR std::uint8_t get_value(Elem c) const {
return value_at(
sprout::distance(
sprout::uuids::detail::digits<Elem>::table.begin(),
sprout::uuids::detail::digits<Elem>::value.begin(),
sprout::find(
sprout::uuids::detail::digits<Elem>::table.begin(),
sprout::uuids::detail::digits<Elem>::table.end(),
sprout::uuids::detail::digits<Elem>::value.begin(),
sprout::uuids::detail::digits<Elem>::value.end(),
c
)
)
);
}
static SPROUT_CONSTEXPR bool is_dash(char c) {
return c == '-';
template<typename Elem>
static SPROUT_CONSTEXPR bool is_dash(Elem c) {
return c == sprout::uuids::detail::dash<Elem>::value;
}
static SPROUT_CONSTEXPR bool is_dash(wchar_t c) {
return c == L'-';
template<typename Elem>
static SPROUT_CONSTEXPR bool is_open_brace(Elem c) {
return c == sprout::uuids::detail::lbrace<Elem>::value;
}
static SPROUT_CONSTEXPR bool is_dash(char16_t c) {
return c == u'-';
template<typename Elem>
static SPROUT_CONSTEXPR bool is_close_brace(Elem c) {
return c == sprout::uuids::detail::rbrace<Elem>::value;
}
static SPROUT_CONSTEXPR bool is_dash(char32_t c) {
return c == U'-';
}
static SPROUT_CONSTEXPR bool is_open_brace(char c) {
return c == '{';
}
static SPROUT_CONSTEXPR bool is_open_brace(wchar_t c) {
return c == L'{';
}
static SPROUT_CONSTEXPR bool is_open_brace(char16_t c) {
return c == u'{';
}
static SPROUT_CONSTEXPR bool is_open_brace(char32_t c) {
return c == U'{';
}
static SPROUT_CONSTEXPR bool is_close_brace(char c, char open_brace) {
return open_brace == '{' && c == '}';
}
static SPROUT_CONSTEXPR bool is_close_brace(wchar_t c, char open_brace) {
return open_brace == L'{' && c == L'}';
}
static SPROUT_CONSTEXPR bool is_close_brace(char16_t c, char open_brace) {
return open_brace == u'{' && c == u'}';
}
static SPROUT_CONSTEXPR bool is_close_brace(char32_t c, char open_brace) {
return open_brace == U'{' && c == U'}';
template<typename Elem>
static SPROUT_CONSTEXPR bool is_close_brace(Elem c, Elem open_brace) {
return is_open_brace(open_brace) && is_close_brace(c);
}
template<typename ForwardIterator, typename Char, typename... Args>
SPROUT_CONSTEXPR result_type

View file

@ -23,115 +23,25 @@
#include <sprout/container/metafunctions.hpp>
#include <sprout/range/algorithm/equal.hpp>
#include <sprout/range/ptr_range.hpp>
#include <sprout/detail/literal_def.hpp>
namespace sprout {
namespace uuids {
namespace detail {
template<typename T>
inline SPROUT_CONSTEXPR sprout::basic_string<T, 3>
dns_token();
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char, 3>
dns_token<char>() {
return sprout::to_string("dns");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<wchar_t, 3>
dns_token<wchar_t>() {
return sprout::to_string(L"dns");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char16_t, 3>
dns_token<char16_t>() {
return sprout::to_string(u"dns");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char32_t, 3>
dns_token<char32_t>() {
return sprout::to_string(U"dns");
}
template<typename T>
inline SPROUT_CONSTEXPR sprout::basic_string<T, 3>
url_token();
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char, 3>
url_token<char>() {
return sprout::to_string("url");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<wchar_t, 3>
url_token<wchar_t>() {
return sprout::to_string(L"url");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char16_t, 3>
url_token<char16_t>() {
return sprout::to_string(u"url");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char32_t, 3>
url_token<char32_t>() {
return sprout::to_string(U"url");
}
template<typename T>
inline SPROUT_CONSTEXPR sprout::basic_string<T, 3>
oid_token();
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char, 3>
oid_token<char>() {
return sprout::to_string("oid");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<wchar_t, 3>
oid_token<wchar_t>() {
return sprout::to_string(L"oid");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char16_t, 3>
oid_token<char16_t>() {
return sprout::to_string(u"oid");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char32_t, 3>
oid_token<char32_t>() {
return sprout::to_string(U"oid");
}
template<typename T>
inline SPROUT_CONSTEXPR sprout::basic_string<T, 4>
x500_token();
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char, 4>
x500_token<char>() {
return sprout::to_string("x500");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<wchar_t, 4>
x500_token<wchar_t>() {
return sprout::to_string(L"x500");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char16_t, 4>
x500_token<char16_t>() {
return sprout::to_string(u"x500");
}
template<>
inline SPROUT_CONSTEXPR sprout::basic_string<char32_t, 4>
x500_token<char32_t>() {
return sprout::to_string(U"x500");
}
SPROUT_LITERAL_STRING_DEF(dns_token, "dns", 3);
SPROUT_LITERAL_STRING_DEF(url_token, "url", 3);
SPROUT_LITERAL_STRING_DEF(oid_token, "oid", 3);
SPROUT_LITERAL_STRING_DEF(x500_token, "x500", 4);
template<typename InputRange>
inline SPROUT_CONSTEXPR sprout::uuids::md5_name_generator
uuid3_impl(InputRange const& rng) {
typedef typename std::decay<typename sprout::containers::value_type<InputRange>::type>::type value_type;
typedef sprout::ctypes::nocase_equal_to<value_type> predicate_type;
return sprout::range::equal(rng, sprout::uuids::detail::dns_token<value_type>(), predicate_type()) ? sprout::uuids::make_uuid3_dns()
: sprout::range::equal(rng, sprout::uuids::detail::url_token<value_type>(), predicate_type()) ? sprout::uuids::make_uuid3_url()
: sprout::range::equal(rng, sprout::uuids::detail::oid_token<value_type>(), predicate_type()) ? sprout::uuids::make_uuid3_oid()
: sprout::range::equal(rng, sprout::uuids::detail::x500_token<value_type>(), predicate_type()) ? sprout::uuids::make_uuid3_x500()
return sprout::range::equal(rng, sprout::uuids::detail::dns_token<value_type>::value, predicate_type()) ? sprout::uuids::make_uuid3_dns()
: sprout::range::equal(rng, sprout::uuids::detail::url_token<value_type>::value, predicate_type()) ? sprout::uuids::make_uuid3_url()
: sprout::range::equal(rng, sprout::uuids::detail::oid_token<value_type>::value, predicate_type()) ? sprout::uuids::make_uuid3_oid()
: sprout::range::equal(rng, sprout::uuids::detail::x500_token<value_type>::value, predicate_type()) ? sprout::uuids::make_uuid3_x500()
: sprout::uuids::make_uuid3(sprout::uuids::make_uuid(sprout::begin(rng), sprout::end(rng)))
;
}
@ -141,10 +51,10 @@ namespace sprout {
uuid5_impl(InputRange const& rng) {
typedef typename std::decay<typename sprout::containers::value_type<InputRange>::type>::type value_type;
typedef sprout::ctypes::nocase_equal_to<value_type> predicate_type;
return sprout::range::equal(rng, sprout::uuids::detail::dns_token<value_type>(), predicate_type()) ? sprout::uuids::make_uuid5_dns()
: sprout::range::equal(rng, sprout::uuids::detail::url_token<value_type>(), predicate_type()) ? sprout::uuids::make_uuid5_url()
: sprout::range::equal(rng, sprout::uuids::detail::oid_token<value_type>(), predicate_type()) ? sprout::uuids::make_uuid5_oid()
: sprout::range::equal(rng, sprout::uuids::detail::x500_token<value_type>(), predicate_type()) ? sprout::uuids::make_uuid5_x500()
return sprout::range::equal(rng, sprout::uuids::detail::dns_token<value_type>::value, predicate_type()) ? sprout::uuids::make_uuid5_dns()
: sprout::range::equal(rng, sprout::uuids::detail::url_token<value_type>::value, predicate_type()) ? sprout::uuids::make_uuid5_url()
: sprout::range::equal(rng, sprout::uuids::detail::oid_token<value_type>::value, predicate_type()) ? sprout::uuids::make_uuid5_oid()
: sprout::range::equal(rng, sprout::uuids::detail::x500_token<value_type>::value, predicate_type()) ? sprout::uuids::make_uuid5_x500()
: sprout::uuids::make_uuid5(sprout::uuids::make_uuid(sprout::begin(rng), sprout::end(rng)))
;
}