summaryrefslogtreecommitdiff
path: root/include/rtl
diff options
context:
space:
mode:
Diffstat (limited to 'include/rtl')
-rw-r--r--include/rtl/stringutils.hxx2
-rw-r--r--include/rtl/ustrbuf.hxx20
-rw-r--r--include/rtl/ustring.hxx158
3 files changed, 101 insertions, 79 deletions
diff --git a/include/rtl/stringutils.hxx b/include/rtl/stringutils.hxx
index 40b03c84f4bb..29a7904e6019 100644
--- a/include/rtl/stringutils.hxx
+++ b/include/rtl/stringutils.hxx
@@ -255,6 +255,8 @@ struct ConstCharArrayDetector<sal_Unicode const [N], T> {
using TypeUtf16 = T;
static constexpr bool const ok = true;
static constexpr std::size_t const length = N - 1;
+ static constexpr bool isValid(sal_Unicode const (& literal)[N])
+ { return literal[N - 1] == '\0'; }
static constexpr sal_Unicode const * toPointer(
sal_Unicode const (& literal)[N])
{ return literal; }
diff --git a/include/rtl/ustrbuf.hxx b/include/rtl/ustrbuf.hxx
index 2d957d81064e..9e8a586279b0 100644
--- a/include/rtl/ustrbuf.hxx
+++ b/include/rtl/ustrbuf.hxx
@@ -177,7 +177,7 @@ public:
OUStringBuffer(OUStringLiteral const & literal):
pData(nullptr), nCapacity(literal.size + 16) //TODO: check for overflow
{
- rtl_uString_newFromLiteral(&pData, literal.data, literal.size, 16);
+ rtl_uStringbuffer_newFromStr_WithLength(&pData, literal.data, literal.size);
}
#endif
@@ -320,11 +320,9 @@ public:
if (n >= nCapacity) {
ensureCapacity(n + 16); //TODO: check for overflow
}
- char const * from = literal.data;
- sal_Unicode * to = pData->buffer;
- for (sal_Int32 i = 0; i <= n; ++i) {
- to[i] = from[i];
- }
+ std::memcpy(
+ pData->buffer, literal.data,
+ (n + 1) * sizeof (sal_Unicode)); //TODO: check for overflow
pData->length = n;
return *this;
}
@@ -662,7 +660,7 @@ public:
/** @overload @since LibreOffice 5.4 */
OUStringBuffer & append(OUStringLiteral const & literal) {
- return appendAscii(literal.data, literal.size);
+ return append(literal.data, literal.size);
}
#endif
@@ -1040,9 +1038,7 @@ public:
/** @overload @since LibreOffice 5.4 */
OUStringBuffer & insert(sal_Int32 offset, OUStringLiteral const & literal) {
- rtl_uStringbuffer_insert_ascii(
- &pData, &nCapacity, offset, literal.data, literal.size);
- return *this;
+ return insert(offset, literal.data, literal.size);
}
#endif
@@ -1453,7 +1449,7 @@ public:
sal_Int32 indexOf(OUStringLiteral const & literal, sal_Int32 fromIndex = 0)
const
{
- sal_Int32 n = rtl_ustr_indexOfAscii_WithLength(
+ sal_Int32 n = rtl_ustr_indexOfStr_WithLength(
pData->buffer + fromIndex, pData->length - fromIndex, literal.data,
literal.size);
return n < 0 ? n : n + fromIndex;
@@ -1539,7 +1535,7 @@ public:
/** @overload @since LibreOffice 5.4 */
sal_Int32 lastIndexOf(OUStringLiteral const & literal) const {
- return rtl_ustr_lastIndexOfAscii_WithLength(
+ return rtl_ustr_lastIndexOfStr_WithLength(
pData->buffer, pData->length, literal.data, literal.size);
}
#endif
diff --git a/include/rtl/ustring.hxx b/include/rtl/ustring.hxx
index d73977192cd0..2f9518029be1 100644
--- a/include/rtl/ustring.hxx
+++ b/include/rtl/ustring.hxx
@@ -78,7 +78,7 @@ struct SAL_WARN_UNUSED OUStringLiteral
template<typename T> constexpr OUStringLiteral(
T & literal,
typename libreoffice_internal::ConstCharArrayDetector<
- T, libreoffice_internal::Dummy>::Type
+ T, libreoffice_internal::Dummy>::TypeUtf16
= libreoffice_internal::Dummy()):
size(libreoffice_internal::ConstCharArrayDetector<T>::length),
data(
@@ -88,8 +88,10 @@ struct SAL_WARN_UNUSED OUStringLiteral
libreoffice_internal::ConstCharArrayDetector<T>::isValid(literal));
}
+ constexpr operator std::u16string_view() const { return {data, unsigned(size)}; }
+
int size;
- const char* data;
+ const sal_Unicode* data;
// So we can use this struct in some places interchangeably with OUString
constexpr sal_Int32 getLength() const { return size; }
@@ -330,12 +332,12 @@ public:
written as
- OUString(flag ? OUStringLiteral("a") : OUStringLiteral("bb"))
+ OUString(flag ? OUStringLiteral(u"a") : OUStringLiteral(u"bb"))
@since LibreOffice 5.0
*/
OUString(OUStringLiteral literal): pData(NULL) {
- rtl_uString_newFromLiteral(&pData, literal.data, literal.size, 0);
+ rtl_uString_newFromStr_WithLength(&pData, literal.data, literal.size);
}
/// @endcond
#endif
@@ -532,7 +534,7 @@ public:
if (literal.size == 0) {
rtl_uString_new(&pData);
} else {
- rtl_uString_newFromLiteral(&pData, literal.data, literal.size, 0);
+ rtl_uString_newFromStr_WithLength(&pData, literal.data, literal.size);
}
return *this;
}
@@ -614,7 +616,7 @@ public:
/** @overload @since LibreOffice 5.4 */
OUString & operator +=(OUStringLiteral const & literal) & {
- rtl_uString_newConcatAsciiL(&pData, pData, literal.data, literal.size);
+ rtl_uString_newConcatUtf16L(&pData, pData, literal.data, literal.size);
return *this;
}
void operator +=(OUStringLiteral const &) && = delete;
@@ -803,7 +805,7 @@ public:
/** @overload @since LibreOffice 5.4 */
sal_Int32 reverseCompareTo(OUStringLiteral const & literal) const {
- return rtl_ustr_asciil_reverseCompare_WithLength(
+ return rtl_ustr_reverseCompare_WithLength(
pData->buffer, pData->length, literal.data, literal.size);
}
#endif
@@ -911,10 +913,10 @@ public:
/** @overload @since LibreOffice 5.4 */
bool equalsIgnoreAsciiCase(OUStringLiteral const & literal) const {
- return pData->length == literal.size
- && (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLength(
- pData->buffer, pData->length, literal.data)
- == 0);
+ return
+ rtl_ustr_compareIgnoreAsciiCase_WithLength(
+ pData->buffer, pData->length, literal.data, literal.size)
+ == 0;
}
#endif
@@ -977,9 +979,9 @@ public:
/** @overload @since LibreOffice 5.4 */
bool match(OUStringLiteral const & literal, sal_Int32 fromIndex = 0) const {
return
- rtl_ustr_ascii_shortenedCompare_WithLength(
+ rtl_ustr_shortenedCompare_WithLength(
pData->buffer + fromIndex, pData->length - fromIndex,
- literal.data, literal.size)
+ literal.data, literal.size, literal.size)
== 0;
}
#endif
@@ -1049,9 +1051,9 @@ public:
OUStringLiteral const & literal, sal_Int32 fromIndex = 0) const
{
return
- rtl_ustr_ascii_shortenedCompareIgnoreAsciiCase_WithLength(
+ rtl_ustr_shortenedCompareIgnoreAsciiCase_WithLength(
pData->buffer+fromIndex, pData->length-fromIndex, literal.data,
- literal.size)
+ literal.size, literal.size)
== 0;
}
#endif
@@ -1402,8 +1404,9 @@ public:
const
{
bool b = literal.size <= pData->length
- && rtl_ustr_asciil_reverseEquals_WithLength(
- pData->buffer, literal.data, literal.size);
+ && (rtl_ustr_reverseCompare_WithLength(
+ pData->buffer, literal.size, literal.data, literal.size)
+ == 0);
if (b && rest != nullptr) {
*rest = copy(literal.size);
}
@@ -1494,7 +1497,7 @@ public:
OUStringLiteral const & literal, OUString * rest = nullptr) const
{
bool b
- = (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
+ = (rtl_ustr_compareIgnoreAsciiCase_WithLength(
pData->buffer, literal.size, literal.data, literal.size)
== 0);
if (b && rest != nullptr) {
@@ -1586,9 +1589,10 @@ public:
const
{
bool b = literal.size <= pData->length
- && rtl_ustr_asciil_reverseEquals_WithLength(
- pData->buffer + pData->length - literal.size,
- literal.data, literal.size);
+ && (rtl_ustr_reverseCompare_WithLength(
+ pData->buffer + pData->length - literal.size, literal.size,
+ literal.data, literal.size)
+ == 0);
if (b && rest != nullptr) {
*rest = copy(0, (getLength() - literal.size));
}
@@ -1707,7 +1711,7 @@ public:
OUStringLiteral const & literal, OUString * rest = nullptr) const
{
bool b = literal.size <= pData->length
- && (rtl_ustr_ascii_compareIgnoreAsciiCase_WithLengths(
+ && (rtl_ustr_compareIgnoreAsciiCase_WithLength(
pData->buffer + pData->length - literal.size,
literal.size, literal.data, literal.size)
== 0);
@@ -1882,75 +1886,87 @@ public:
*/
friend bool operator ==(OUString const & lhs, OUStringLiteral const & rhs) {
- return lhs.equalsAsciiL(rhs.data, rhs.size);
+ return
+ rtl_ustr_reverseCompare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data, rhs.size)
+ == 0;
}
friend bool operator !=(OUString const & lhs, OUStringLiteral const & rhs) {
- return !lhs.equalsAsciiL(rhs.data, rhs.size);
+ return
+ rtl_ustr_reverseCompare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data, rhs.size)
+ != 0;
}
friend bool operator <(OUString const & lhs, OUStringLiteral const & rhs) {
return
- (rtl_ustr_ascii_compare_WithLength(
- lhs.pData->buffer, lhs.pData->length, rhs.data))
+ (rtl_ustr_compare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data, rhs.size))
< 0;
}
friend bool operator <=(OUString const & lhs, OUStringLiteral const & rhs) {
return
- (rtl_ustr_ascii_compare_WithLength(
- lhs.pData->buffer, lhs.pData->length, rhs.data))
+ (rtl_ustr_compare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data, rhs.size))
<= 0;
}
friend bool operator >(OUString const & lhs, OUStringLiteral const & rhs) {
return
- (rtl_ustr_ascii_compare_WithLength(
- lhs.pData->buffer, lhs.pData->length, rhs.data))
+ (rtl_ustr_compare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data, rhs.size))
> 0;
}
friend bool operator >=(OUString const & lhs, OUStringLiteral const & rhs) {
return
- (rtl_ustr_ascii_compare_WithLength(
- lhs.pData->buffer, lhs.pData->length, rhs.data))
+ (rtl_ustr_compare_WithLength(
+ lhs.pData->buffer, lhs.pData->length, rhs.data, rhs.size))
>= 0;
}
friend bool operator ==(OUStringLiteral const & lhs, OUString const & rhs) {
- return rhs.equalsAsciiL(lhs.data, lhs.size);
+ return
+ rtl_ustr_reverseCompare_WithLength(
+ lhs.data, lhs.size, rhs.pData->buffer, rhs.pData->length)
+ == 0;
}
friend bool operator !=(OUStringLiteral const & lhs, OUString const & rhs) {
- return !rhs.equalsAsciiL(lhs.data, lhs.size);
+ return
+ rtl_ustr_reverseCompare_WithLength(
+ lhs.data, lhs.size, rhs.pData->buffer, rhs.pData->length)
+ != 0;
}
friend bool operator <(OUStringLiteral const & lhs, OUString const & rhs) {
return
- (rtl_ustr_ascii_compare_WithLength(
- rhs.pData->buffer, rhs.pData->length, lhs.data))
- >= 0;
+ (rtl_ustr_compare_WithLength(
+ lhs.data, lhs.size, rhs.pData->buffer, rhs.pData->length))
+ < 0;
}
friend bool operator <=(OUStringLiteral const & lhs, OUString const & rhs) {
return
- (rtl_ustr_ascii_compare_WithLength(
- rhs.pData->buffer, rhs.pData->length, lhs.data))
- > 0;
+ (rtl_ustr_compare_WithLength(
+ lhs.data, lhs.size, rhs.pData->buffer, rhs.pData->length))
+ <= 0;
}
friend bool operator >(OUStringLiteral const & lhs, OUString const & rhs) {
return
- (rtl_ustr_ascii_compare_WithLength(
- rhs.pData->buffer, rhs.pData->length, lhs.data))
- <= 0;
+ (rtl_ustr_compare_WithLength(
+ lhs.data, lhs.size, rhs.pData->buffer, rhs.pData->length))
+ > 0;
}
friend bool operator >=(OUStringLiteral const & lhs, OUString const & rhs) {
return
- (rtl_ustr_ascii_compare_WithLength(
- rhs.pData->buffer, rhs.pData->length, lhs.data))
- < 0;
+ (rtl_ustr_compare_WithLength(
+ lhs.data, lhs.size, rhs.pData->buffer, rhs.pData->length))
+ >= 0;
}
/// @endcond
@@ -2075,7 +2091,7 @@ public:
sal_Int32 indexOf(OUStringLiteral const & literal, sal_Int32 fromIndex = 0)
const
{
- sal_Int32 n = rtl_ustr_indexOfAscii_WithLength(
+ sal_Int32 n = rtl_ustr_indexOfStr_WithLength(
pData->buffer + fromIndex, pData->length - fromIndex, literal.data,
literal.size);
return n < 0 ? n : n + fromIndex;
@@ -2195,7 +2211,7 @@ public:
/** @overload @since LibreOffice 5.4 */
sal_Int32 lastIndexOf(OUStringLiteral const & literal) const {
- return rtl_ustr_lastIndexOfAscii_WithLength(
+ return rtl_ustr_lastIndexOfStr_WithLength(
pData->buffer, pData->length, literal.data, literal.size);
}
#endif
@@ -2572,8 +2588,8 @@ public:
{
rtl_uString * s = nullptr;
sal_Int32 i = 0;
- rtl_uString_newReplaceFirstAsciiL(
- &s, pData, from.data, from.size, to.pData,
+ rtl_uString_newReplaceFirstUtf16LUtf16L(
+ &s, pData, from.data, from.size, to.pData->buffer, to.pData->length,
index == nullptr ? &i : index);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -2584,8 +2600,8 @@ public:
{
rtl_uString * s = nullptr;
sal_Int32 i = 0;
- rtl_uString_newReplaceFirstToAsciiL(
- &s, pData, from.pData, to.data, to.size,
+ rtl_uString_newReplaceFirstUtf16LUtf16L(
+ &s, pData, from.pData->buffer, from.pData->length, to.data, to.size,
index == nullptr ? &i : index);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -2596,7 +2612,7 @@ public:
{
rtl_uString * s = nullptr;
sal_Int32 i = 0;
- rtl_uString_newReplaceFirstAsciiLAsciiL(
+ rtl_uString_newReplaceFirstUtf16LUtf16L(
&s, pData, from.data, from.size, to.data, to.size,
index == nullptr ? &i : index);
return OUString(s, SAL_NO_ACQUIRE);
@@ -2610,7 +2626,7 @@ public:
assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(to));
rtl_uString * s = nullptr;
sal_Int32 i = 0;
- rtl_uString_newReplaceFirstAsciiLAsciiL(
+ rtl_uString_newReplaceFirstUtf16LAsciiL(
&s, pData, from.data, from.size,
libreoffice_internal::ConstCharArrayDetector<T>::toPointer(to),
libreoffice_internal::ConstCharArrayDetector<T>::length,
@@ -2626,7 +2642,7 @@ public:
assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(from));
rtl_uString * s = nullptr;
sal_Int32 i = 0;
- rtl_uString_newReplaceFirstAsciiLAsciiL(
+ rtl_uString_newReplaceFirstAsciiLUtf16L(
&s, pData,
libreoffice_internal::ConstCharArrayDetector<T>::toPointer(from),
libreoffice_internal::ConstCharArrayDetector<T>::length, to.data,
@@ -2643,7 +2659,7 @@ public:
assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(to));
rtl_uString * s = nullptr;
sal_Int32 i = 0;
- rtl_uString_newReplaceFirstAsciiLUtf16L(
+ rtl_uString_newReplaceFirstUtf16LUtf16L(
&s, pData, from.data, from.size,
libreoffice_internal::ConstCharArrayDetector<T>::toPointer(to),
libreoffice_internal::ConstCharArrayDetector<T>::length,
@@ -2660,7 +2676,7 @@ public:
assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(from));
rtl_uString * s = nullptr;
sal_Int32 i = 0;
- rtl_uString_newReplaceFirstUtf16LAsciiL(
+ rtl_uString_newReplaceFirstUtf16LUtf16L(
&s, pData,
libreoffice_internal::ConstCharArrayDetector<T>::toPointer(from),
libreoffice_internal::ConstCharArrayDetector<T>::length, to.data,
@@ -2877,8 +2893,8 @@ public:
OUStringLiteral const & from, OUString const & to) const
{
rtl_uString * s = nullptr;
- rtl_uString_newReplaceAllAsciiL(
- &s, pData, from.data, from.size, to.pData);
+ rtl_uString_newReplaceAllUtf16LUtf16L(
+ &s, pData, from.data, from.size, to.pData->buffer, to.pData->length);
return OUString(s, SAL_NO_ACQUIRE);
}
/** @overload @since LibreOffice 5.4 */
@@ -2886,8 +2902,8 @@ public:
OUString const & from, OUStringLiteral const & to) const
{
rtl_uString * s = nullptr;
- rtl_uString_newReplaceAllToAsciiL(
- &s, pData, from.pData, to.data, to.size);
+ rtl_uString_newReplaceAllUtf16LUtf16L(
+ &s, pData, from.pData->buffer, from.pData->length, to.data, to.size);
return OUString(s, SAL_NO_ACQUIRE);
}
/** @overload @since LibreOffice 5.4 */
@@ -2895,7 +2911,7 @@ public:
OUStringLiteral const & from, OUStringLiteral const & to) const
{
rtl_uString * s = nullptr;
- rtl_uString_newReplaceAllAsciiLAsciiL(
+ rtl_uString_newReplaceAllUtf16LUtf16L(
&s, pData, from.data, from.size, to.data, to.size);
return OUString(s, SAL_NO_ACQUIRE);
}
@@ -2905,7 +2921,7 @@ public:
replaceAll(OUStringLiteral const & from, T & to) const {
assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(to));
rtl_uString * s = nullptr;
- rtl_uString_newReplaceAllAsciiLAsciiL(
+ rtl_uString_newReplaceAllUtf16LAsciiL(
&s, pData, from.data, from.size,
libreoffice_internal::ConstCharArrayDetector<T>::toPointer(to),
libreoffice_internal::ConstCharArrayDetector<T>::length);
@@ -2917,7 +2933,7 @@ public:
replaceAll(T & from, OUStringLiteral const & to) const {
assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(from));
rtl_uString * s = nullptr;
- rtl_uString_newReplaceAllAsciiLAsciiL(
+ rtl_uString_newReplaceAllAsciiLUtf16L(
&s, pData,
libreoffice_internal::ConstCharArrayDetector<T>::toPointer(from),
libreoffice_internal::ConstCharArrayDetector<T>::length, to.data,
@@ -2931,7 +2947,7 @@ public:
replaceAll(OUStringLiteral const & from, T & to) const {
assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(to));
rtl_uString * s = nullptr;
- rtl_uString_newReplaceAllAsciiLUtf16L(
+ rtl_uString_newReplaceAllUtf16LUtf16L(
&s, pData, from.data, from.size,
libreoffice_internal::ConstCharArrayDetector<T>::toPointer(to),
libreoffice_internal::ConstCharArrayDetector<T>::length);
@@ -2944,7 +2960,7 @@ public:
replaceAll(T & from, OUStringLiteral const & to) const {
assert(libreoffice_internal::ConstCharArrayDetector<T>::isValid(from));
rtl_uString * s = nullptr;
- rtl_uString_newReplaceAllUtf16LAsciiL(
+ rtl_uString_newReplaceAllUtf16LUtf16L(
&s, pData,
libreoffice_internal::ConstCharArrayDetector<T>::toPointer(from),
libreoffice_internal::ConstCharArrayDetector<T>::length, to.data,
@@ -3609,6 +3625,14 @@ public:
}
#if defined LIBO_INTERNAL_ONLY
+ static OUString createFromAscii(std::string_view value) {
+ rtl_uString * p = nullptr;
+ rtl_uString_newFromLiteral(&p, value.data(), value.size(), 0); //TODO: check for overflow
+ return OUString(p, SAL_NO_ACQUIRE);
+ }
+ #endif
+
+#if defined LIBO_INTERNAL_ONLY
operator std::u16string_view() const { return {getStr(), sal_uInt32(getLength())}; }
#endif
@@ -3661,7 +3685,7 @@ template<>
struct ToStringHelper< OUStringLiteral >
{
static std::size_t length( const OUStringLiteral& str ) { return str.size; }
- static sal_Unicode* addData( sal_Unicode* buffer, const OUStringLiteral& str ) { return addDataLiteral( buffer, str.data, str.size ); }
+ static sal_Unicode* addData( sal_Unicode* buffer, const OUStringLiteral& str ) { return addDataHelper( buffer, str.data, str.size ); }
static const bool allowOStringConcat = false;
static const bool allowOUStringConcat = true;
};