📄 static_string.hpp
字号:
/// The maximum number of elements that can be stored in the string
static size_type max_size();
/// The number of elements in the string
size_type length() const;
/// The storage currently allocated by the string
size_type capacity() const;
/// Indicates whether the string is empty
ss_bool_t empty() const;
/// @}
/// \name Comparison
/// @{
public:
/// Compares \c this with the given string
ss_sint_t compare(size_type pos, size_type n, value_type const* s, size_type cchRhs) const;
/// Compares \c this with the given string
ss_sint_t compare(size_type pos, size_type n, value_type const* s) const;
/// Compares \c this with the given string
ss_sint_t compare(value_type const* s) const;
/// Compares \c this with the given string
ss_sint_t compare(size_type pos, size_type n, class_type const& rhs, size_type posRhs, size_type cchRhs) const;
/// Compares \c this with the given string
ss_sint_t compare(size_type pos, size_type n, class_type const& rhs) const;
/// Compares \c this with the given string
ss_sint_t compare(class_type const& rhs) const;
/// @}
/// \name Accessors
/// @{
public:
/// Returns mutable reference at the given index
reference operator [](size_type index);
/// Returns non-mutable (const) reference at the given index
const_reference operator [](size_type index) const;
#ifdef STLSOFT_CF_EXCEPTION_SUPPORT
/// Returns mutable (non-const) reference at the given index
///
/// \note Throws std::out_of_range if index >= size()
reference at(size_type index);
/// Returns non-mutable (const) reference at the given index
///
/// \note Throws std::out_of_range if index >= size()
const_reference at(size_type index) const;
#endif /* !STLSOFT_CF_EXCEPTION_SUPPORT */
/// Returns null-terminated non-mutable (const) pointer to string data
value_type const *c_str() const;
/// Returns non-mutable (const) pointer to string data
value_type const *data() const;
/// Copies elements into the given destination
size_type copy(value_type *dest, size_type cch_, size_type pos = 0) const;
/// @}
/// \name Iteration
/// @{
public:
/// Begins the iteration
///
/// \return A non-mutable (const) iterator representing the start of the sequence
const_iterator begin() const;
/// Ends the iteration
///
/// \return A non-mutable (const) iterator representing the end of the sequence
const_iterator end() const;
/// Begins the iteration
///
/// \return An iterator representing the start of the sequence
iterator begin();
/// Ends the iteration
///
/// \return An iterator representing the end of the sequence
iterator end();
#if defined(STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT)
/// Begins the reverse iteration
///
/// \return A non-mutable (const) iterator representing the start of the reverse sequence
const_reverse_iterator rbegin() const;
/// Ends the reverse iteration
///
/// \return A non-mutable (const) iterator representing the end of the reverse sequence
const_reverse_iterator rend() const;
/// Begins the reverse iteration
///
/// \return An iterator representing the start of the reverse sequence
reverse_iterator rbegin();
/// Ends the reverse iteration
///
/// \return An iterator representing the end of the reverse sequence
reverse_iterator rend();
#endif /* STLSOFT_CF_BIDIRECTIONAL_ITERATOR_SUPPORT */
/// @}
/// \name Implementation
/// @{
private:
// Length
size_type length_() const;
// Invariance
ss_bool_t is_valid() const;
// Comparison
static ss_sint_t compare_(char_type const* lhs, size_type lhs_len, char_type const* rhs, size_type rhs_len);
// Assignment
#if defined(STLSOFT_CF_MEMBER_TEMPLATE_RANGE_METHOD_SUPPORT)
template <ss_typename_param_k II>
# if defined(STLSOFT_COMPILER_IS_MWERKS) || \
defined(STLSOFT_COMPILER_IS_DMC)
// There seems to be a bug in CodeWarrior that makes it have a cow with iterator tags by value, so we just use a ptr
class_type &assign_(II first, II last, stlsoft_ns_qual_std(input_iterator_tag) const*)
# else /* ? compiler */
class_type &assign_(II first, II last, stlsoft_ns_qual_std(input_iterator_tag))
# endif /* compiler */
{
stlsoft_ns_qual_std(copy)(first, last, stlsoft_ns_qual_std(back_inserter)(*this));
return *this;
}
template <ss_typename_param_k II>
# if defined(STLSOFT_COMPILER_IS_MWERKS) || \
defined(STLSOFT_COMPILER_IS_DMC)
// There seems to be a bug in CodeWarrior that makes it have a cow with iterator tags by value, so we just use a ptr
class_type &assign_(II first, II last, stlsoft_ns_qual_std(forward_iterator_tag) const*)
# else /* ? compiler */
class_type &assign_(II first, II last, stlsoft_ns_qual_std(forward_iterator_tag))
# endif /* compiler */
{
buffer_type_ buffer(static_cast<ss_size_t>(stlsoft_ns_qual_std(distance)(first, last)));
stlsoft_ns_qual_std(copy)(first, last, buffer.begin());
assign(buffer.data(), buffer.size());
return *this;
}
#endif /* STLSOFT_CF_MEMBER_TEMPLATE_RANGE_METHOD_SUPPORT */
// Appending
#if defined(STLSOFT_CF_MEMBER_TEMPLATE_RANGE_METHOD_SUPPORT)
template <ss_typename_param_k II>
# if defined(STLSOFT_COMPILER_IS_MWERKS) || \
defined(STLSOFT_COMPILER_IS_DMC)
class_type &append_(II first, II last, stlsoft_ns_qual_std(input_iterator_tag) const*)
# else /* ? compiler */
class_type &append_(II first, II last, stlsoft_ns_qual_std(input_iterator_tag))
# endif /* compiler */
{
stlsoft_ns_qual_std(copy)(first, last, stlsoft_ns_qual_std(back_inserter)(*this));
STLSOFT_ASSERT(is_valid());
return *this;
}
template <ss_typename_param_k II>
# if defined(STLSOFT_COMPILER_IS_MWERKS) || \
defined(STLSOFT_COMPILER_IS_DMC)
class_type &append_(II first, II last, stlsoft_ns_qual_std(forward_iterator_tag) const*)
# else /* ? compiler */
class_type &append_(II first, II last, stlsoft_ns_qual_std(forward_iterator_tag))
# endif /* compiler */
{
buffer_type_ buffer(static_cast<ss_size_t>(stlsoft_ns_qual_std(distance)(first, last)));
stlsoft_ns_qual_std(copy)(first, last, &buffer[0]);
append(buffer.data(), buffer.size());
STLSOFT_ASSERT(is_valid());
return *this;
}
#endif /* STLSOFT_CF_MEMBER_TEMPLATE_RANGE_METHOD_SUPPORT */
/// @}
/// \name Members
/// @{
private:
value_type m_buffer[cch + 1];
ss_size_t m_length;
/// @}
};
/* /////////////////////////////////////////////////////////////////////////
* Operators
*/
#ifndef STLSOFT_DOCUMENTATION_SKIP_SECTION
// operator ==
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_bool_t operator ==(basic_static_string<C, CCH, T> const& lhs, basic_static_string<C, CCH, T> const& rhs)
{
#ifdef _DEBUG
// printf("lhs(%s); rhs(%s); lhs.compare(rhs)=%d\n", lhs.c_str(), lhs.c_str(), lhs.compare(rhs));
#endif /* _DEBUG */
return lhs.compare(rhs) == 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator ==(basic_static_string<C, CCH, T> const& lhs, ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator ==(basic_static_string<C, CCH, T> const& lhs, C const* rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return lhs.compare(rhs) == 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator ==(ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* lhs, basic_static_string<C, CCH, T> const& rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator ==(C *lhs, basic_static_string<C, CCH, T> const& rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return rhs.compare(lhs) == 0;
}
// operator !=
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_bool_t operator !=(basic_static_string<C, CCH, T> const& lhs, basic_static_string<C, CCH, T> const& rhs)
{
return lhs.compare(rhs) != 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator !=(basic_static_string<C, CCH, T> const& lhs, ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator !=(basic_static_string<C, CCH, T> const& lhs, C const* rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return lhs.compare(rhs) != 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator !=(ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* lhs, basic_static_string<C, CCH, T> const& rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator !=(C const* lhs, basic_static_string<C, CCH, T> const& rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return rhs.compare(lhs) != 0;
}
// operator <
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_bool_t operator <(basic_static_string<C, CCH, T> const& lhs, basic_static_string<C, CCH, T> const& rhs)
{
return lhs.compare(rhs) < 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator <(basic_static_string<C, CCH, T> const& lhs, ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator <(basic_static_string<C, CCH, T> const& lhs, C const* rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return lhs.compare(rhs) < 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator <(ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* lhs, basic_static_string<C, CCH, T> const& rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator <(C const* lhs, basic_static_string<C, CCH, T> const& rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return rhs.compare(lhs) > 0;
}
// operator <=
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_bool_t operator <=(basic_static_string<C, CCH, T> const& lhs, basic_static_string<C, CCH, T> const& rhs)
{
return lhs.compare(rhs) <= 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator <=(basic_static_string<C, CCH, T> const& lhs, ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator <=(basic_static_string<C, CCH, T> const& lhs, C const* rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return lhs.compare(rhs) <= 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator <=(ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* lhs, basic_static_string<C, CCH, T> const& rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator <=(C const* lhs, basic_static_string<C, CCH, T> const& rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return rhs.compare(lhs) >= 0;
}
// operator >
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
inline ss_bool_t operator >(basic_static_string<C, CCH, T> const& lhs, basic_static_string<C, CCH, T> const& rhs)
{
return lhs.compare(rhs) > 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator >(basic_static_string<C, CCH, T> const& lhs, ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator >(basic_static_string<C, CCH, T> const& lhs, C const* rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return lhs.compare(rhs) > 0;
}
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
>
#ifdef STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT
inline ss_bool_t operator >(ss_typename_type_k basic_static_string<C, CCH, T>::char_type const* lhs, basic_static_string<C, CCH, T> const& rhs)
#else /* ? STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
inline ss_bool_t operator >(C const* lhs, basic_static_string<C, CCH, T> const& rhs)
#endif /* STLSOFT_CF_TEMPLATE_OUTOFCLASSFN_QUALIFIED_TYPE_SUPPORT */
{
return rhs.compare(lhs) < 0;
}
// operator >=
template< ss_typename_param_k C
, ss_size_t CCH
, ss_typename_param_k T
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -