mirror of
https://github.com/bolero-MURAKAMI/Sprout.git
synced 2024-11-14 10:39:05 +00:00
array 更新
This commit is contained in:
parent
6e14e47ac6
commit
b0ade6c043
1 changed files with 72 additions and 17 deletions
|
@ -108,24 +108,43 @@ namespace sprout {
|
||||||
SPROUT_STATIC_CONSTEXPR size_type npos = -1;
|
SPROUT_STATIC_CONSTEXPR size_type npos = -1;
|
||||||
SPROUT_STATIC_CONSTEXPR size_type static_size = N;
|
SPROUT_STATIC_CONSTEXPR size_type static_size = N;
|
||||||
SPROUT_STATIC_CONSTEXPR size_type fixed_size = static_size;
|
SPROUT_STATIC_CONSTEXPR size_type fixed_size = static_size;
|
||||||
public:
|
|
||||||
T elems[N + 1];
|
|
||||||
size_type len;
|
|
||||||
private:
|
private:
|
||||||
SPROUT_CONSTEXPR int compare_impl_2(int compared, size_type n1, size_type n2) const {
|
static SPROUT_CONSTEXPR int compare_impl_2(int compared, size_type n1, size_type n2) {
|
||||||
return compared != 0 ? compared
|
return compared != 0 ? compared
|
||||||
: n1 < n2 ? -1
|
: n1 < n2 ? -1
|
||||||
: n2 < n1 ? 1
|
: n2 < n1 ? 1
|
||||||
: 0
|
: 0
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
SPROUT_CONSTEXPR int compare_impl_1(size_type pos1, size_type n1, char const* s, size_type n2) const {
|
static SPROUT_CONSTEXPR int compare_impl_1(value_type const* dest, size_type pos1, size_type n1, value_type const* s, size_type n2) {
|
||||||
return compare_impl_2(
|
return compare_impl_2(
|
||||||
traits_type::compare(c_str() + pos1, s, NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(n1, n2)),
|
traits_type::compare(dest + pos1, s, NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(n1, n2)),
|
||||||
n1,
|
n1,
|
||||||
n2
|
n2
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
template<std::ptrdiff_t...Indexes>
|
||||||
|
static SPROUT_CONSTEXPR basic_string<T, N, Traits> from_c_str_impl(
|
||||||
|
value_type const* s,
|
||||||
|
size_type n,
|
||||||
|
sprout::index_tuple<Indexes...>
|
||||||
|
)
|
||||||
|
{
|
||||||
|
return sprout::basic_string<T, N, Traits>{{(Indexes < n ? s[Indexes] : T())...}, n};
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
static SPROUT_CONSTEXPR basic_string<T, N, Traits> from_c_str(value_type const* s, size_type n) {
|
||||||
|
return !(N < n)
|
||||||
|
? from_c_str_impl(s, n, typename sprout::index_range<0, N>::type())
|
||||||
|
: throw "basic_string<>: index out of range"
|
||||||
|
;
|
||||||
|
}
|
||||||
|
static SPROUT_CONSTEXPR basic_string<T, N, Traits> from_c_str(value_type const* s) {
|
||||||
|
return from_c_str(s, traits_type::length(s));
|
||||||
|
}
|
||||||
|
public:
|
||||||
|
T elems[N + 1];
|
||||||
|
size_type len;
|
||||||
public:
|
public:
|
||||||
SPROUT_CONSTEXPR size_type size() const SPROUT_NOEXCEPT {
|
SPROUT_CONSTEXPR size_type size() const SPROUT_NOEXCEPT {
|
||||||
return len;
|
return len;
|
||||||
|
@ -144,6 +163,11 @@ namespace sprout {
|
||||||
throw std::out_of_range("basic_string<>: index out of range");
|
throw std::out_of_range("basic_string<>: index out of range");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
void maxcheck(size_type n) const {
|
||||||
|
if (n > max_size()) {
|
||||||
|
throw std::out_of_range("basic_string<>: index out of range");
|
||||||
|
}
|
||||||
|
}
|
||||||
iterator begin() SPROUT_NOEXCEPT {
|
iterator begin() SPROUT_NOEXCEPT {
|
||||||
return &elems[0];
|
return &elems[0];
|
||||||
}
|
}
|
||||||
|
@ -218,6 +242,21 @@ namespace sprout {
|
||||||
SPROUT_CONSTEXPR const_pointer c_str() const SPROUT_NOEXCEPT {
|
SPROUT_CONSTEXPR const_pointer c_str() const SPROUT_NOEXCEPT {
|
||||||
return &elems[0];
|
return &elems[0];
|
||||||
}
|
}
|
||||||
|
void resize(size_type n, value_type c) {
|
||||||
|
maxcheck(n);
|
||||||
|
if (n > size()) {
|
||||||
|
traits_type::assign(end(), n - size(), c);
|
||||||
|
}
|
||||||
|
traits_type::assign(begin() + n, max_size() - n, value_type());
|
||||||
|
len = n;
|
||||||
|
}
|
||||||
|
void resize(size_type n) {
|
||||||
|
resize(n, value_type());
|
||||||
|
}
|
||||||
|
void clear() {
|
||||||
|
traits_type::assign(begin(), max_size(), value_type());
|
||||||
|
len = 0;
|
||||||
|
}
|
||||||
template<std::size_t N2>
|
template<std::size_t N2>
|
||||||
basic_string<T, N, Traits>& assign(basic_string<T, N2, Traits> const& str) {
|
basic_string<T, N, Traits>& assign(basic_string<T, N2, Traits> const& str) {
|
||||||
return assign(str.begin(), str.size());
|
return assign(str.begin(), str.size());
|
||||||
|
@ -230,9 +269,7 @@ namespace sprout {
|
||||||
return assign(str.begin() + pos, n);
|
return assign(str.begin() + pos, n);
|
||||||
}
|
}
|
||||||
basic_string<T, N, Traits>& assign(value_type const* s, size_type n) {
|
basic_string<T, N, Traits>& assign(value_type const* s, size_type n) {
|
||||||
if (max_size() < n) {
|
maxcheck(n);
|
||||||
throw std::out_of_range("basic_string<>: index out of range");
|
|
||||||
}
|
|
||||||
for (size_type i = 0; i < n; ++i) {
|
for (size_type i = 0; i < n; ++i) {
|
||||||
traits_type::assign(elems[i], s[i]);
|
traits_type::assign(elems[i], s[i]);
|
||||||
}
|
}
|
||||||
|
@ -246,9 +283,7 @@ namespace sprout {
|
||||||
return assign(s, traits_type::length(s));
|
return assign(s, traits_type::length(s));
|
||||||
}
|
}
|
||||||
basic_string<T, N, Traits>& assign(size_type n, value_type c) {
|
basic_string<T, N, Traits>& assign(size_type n, value_type c) {
|
||||||
if (max_size() < n) {
|
maxcheck(n);
|
||||||
throw std::out_of_range("basic_string<>: index out of range");
|
|
||||||
}
|
|
||||||
traits_type::assign(begin(), n, c);
|
traits_type::assign(begin(), n, c);
|
||||||
traits_type::assign(begin() + n, max_size() - n, value_type());
|
traits_type::assign(begin() + n, max_size() - n, value_type());
|
||||||
len = n;
|
len = n;
|
||||||
|
@ -306,7 +341,15 @@ namespace sprout {
|
||||||
}
|
}
|
||||||
SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, char const* s, size_type n2) const {
|
SPROUT_CONSTEXPR int compare(size_type pos1, size_type n1, char const* s, size_type n2) const {
|
||||||
return !(size() < pos1)
|
return !(size() < pos1)
|
||||||
? compare_impl_1(pos1, NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(n1, size() - pos1), s, n2)
|
? compare_impl_1(c_str(), pos1, NS_SSCRISK_CEL_OR_SPROUT_DETAIL::min(n1, size() - pos1), s, n2)
|
||||||
|
: throw "basic_string<>: index out of range"
|
||||||
|
;
|
||||||
|
}
|
||||||
|
SPROUT_CONSTEXPR basic_string<T, N, Traits> substr(size_type pos = 0, size_type n = npos) const {
|
||||||
|
return !(size() < pos)
|
||||||
|
? n == npos
|
||||||
|
? substr(pos, size() - pos)
|
||||||
|
: from_c_str(c_str() + pos, n)
|
||||||
: throw "basic_string<>: index out of range"
|
: throw "basic_string<>: index out of range"
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
@ -590,11 +633,11 @@ namespace sprout {
|
||||||
template<typename T, std::size_t N, std::ptrdiff_t...Indexes>
|
template<typename T, std::size_t N, std::ptrdiff_t...Indexes>
|
||||||
SPROUT_CONSTEXPR inline sprout::basic_string<T, N - 1> to_string_impl_1(
|
SPROUT_CONSTEXPR inline sprout::basic_string<T, N - 1> to_string_impl_1(
|
||||||
T const(& arr)[N],
|
T const(& arr)[N],
|
||||||
sprout::index_tuple<Indexes...>,
|
typename sprout::basic_string<T, N - 1>::size_type n,
|
||||||
typename sprout::basic_string<T, N - 1>::size_type len
|
sprout::index_tuple<Indexes...>
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return sprout::basic_string<T, N - 1>{{(Indexes < len ? arr[Indexes] : T())...}, len};
|
return sprout::basic_string<T, N - 1>{{(Indexes < n ? arr[Indexes] : T())...}, n};
|
||||||
}
|
}
|
||||||
template<typename T, std::size_t N, std::ptrdiff_t...Indexes>
|
template<typename T, std::size_t N, std::ptrdiff_t...Indexes>
|
||||||
SPROUT_CONSTEXPR inline sprout::basic_string<T, N - 1> to_string_impl(
|
SPROUT_CONSTEXPR inline sprout::basic_string<T, N - 1> to_string_impl(
|
||||||
|
@ -602,7 +645,7 @@ namespace sprout {
|
||||||
sprout::index_tuple<Indexes...>
|
sprout::index_tuple<Indexes...>
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return to_string_impl_1(arr, sprout::index_tuple<Indexes...>(), sprout::char_traits<T>::length(arr));
|
return to_string_impl_1(arr, sprout::char_traits<T>::length(arr), sprout::index_tuple<Indexes...>());
|
||||||
}
|
}
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
//
|
//
|
||||||
|
@ -613,6 +656,18 @@ namespace sprout {
|
||||||
return sprout::detail::to_string_impl(arr, typename sprout::index_range<0, N - 1>::type());
|
return sprout::detail::to_string_impl(arr, typename sprout::index_range<0, N - 1>::type());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// string_from_c_str
|
||||||
|
//
|
||||||
|
template<std::size_t N, typename T>
|
||||||
|
SPROUT_CONSTEXPR inline sprout::basic_string<T, N> string_from_c_str(T const* s, std::size_t n) {
|
||||||
|
return sprout::basic_string<T, N>::from_c_str(s, n);
|
||||||
|
}
|
||||||
|
template<std::size_t N, typename T>
|
||||||
|
SPROUT_CONSTEXPR inline sprout::basic_string<T, N> string_from_c_str(T const* s) {
|
||||||
|
return sprout::basic_string<T, N>::from_c_str(s);
|
||||||
|
}
|
||||||
|
|
||||||
template<typename T, std::size_t N, typename Traits>
|
template<typename T, std::size_t N, typename Traits>
|
||||||
SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::push_back<sprout::basic_string<T, N, Traits>, T>::type operator+(
|
SPROUT_CONSTEXPR inline typename sprout::fixed::result_of::push_back<sprout::basic_string<T, N, Traits>, T>::type operator+(
|
||||||
sprout::basic_string<T, N, Traits> const& lhs,
|
sprout::basic_string<T, N, Traits> const& lhs,
|
||||||
|
|
Loading…
Reference in a new issue