Bug 1602452 - Make member functions of nsTStringRepr defined in header constexpr. r=froydnj

Differential Revision: https://phabricator.services.mozilla.com/D56369

--HG--
extra : moz-landing-system : lando
This commit is contained in:
Simon Giesecke 2019-12-09 15:01:22 +00:00
parent d4090928eb
commit 50cf008dd3
2 changed files with 41 additions and 15 deletions

View File

@ -124,8 +124,8 @@ class nsTStringRepr {
typedef StringClassFlags ClassFlags;
// Reading iterators.
const_char_iterator BeginReading() const { return mData; }
const_char_iterator EndReading() const { return mData + mLength; }
constexpr const_char_iterator BeginReading() const { return mData; }
constexpr const_char_iterator EndReading() const { return mData + mLength; }
// Deprecated reading iterators.
const_iterator& BeginReading(const_iterator& aIter) const {
@ -163,26 +163,32 @@ class nsTStringRepr {
#endif
// Returns pointer to string data (not necessarily null-terminated)
const typename raw_type<T, int>::type Data() const { return mData; }
constexpr const typename raw_type<T, int>::type Data() const { return mData; }
size_type Length() const { return mLength; }
constexpr size_type Length() const { return mLength; }
DataFlags GetDataFlags() const { return mDataFlags; }
constexpr DataFlags GetDataFlags() const { return mDataFlags; }
bool IsEmpty() const { return mLength == 0; }
constexpr bool IsEmpty() const { return mLength == 0; }
bool IsLiteral() const { return !!(mDataFlags & DataFlags::LITERAL); }
constexpr bool IsLiteral() const {
return !!(mDataFlags & DataFlags::LITERAL);
}
bool IsVoid() const { return !!(mDataFlags & DataFlags::VOIDED); }
constexpr bool IsVoid() const { return !!(mDataFlags & DataFlags::VOIDED); }
bool IsTerminated() const { return !!(mDataFlags & DataFlags::TERMINATED); }
constexpr bool IsTerminated() const {
return !!(mDataFlags & DataFlags::TERMINATED);
}
char_type CharAt(index_type aIndex) const {
constexpr char_type CharAt(index_type aIndex) const {
NS_ASSERTION(aIndex < mLength, "index exceeds allowable range");
return mData[aIndex];
}
char_type operator[](index_type aIndex) const { return CharAt(aIndex); }
constexpr char_type operator[](index_type aIndex) const {
return CharAt(aIndex);
}
char_type First() const;
@ -347,14 +353,15 @@ Compare(const mozilla::detail::nsTStringRepr<T>& aLhs,
const nsTStringComparator<T>& = nsTDefaultStringComparator<T>());
template <typename T>
inline bool operator!=(const mozilla::detail::nsTStringRepr<T>& aLhs,
const mozilla::detail::nsTStringRepr<T>& aRhs) {
inline constexpr bool operator!=(
const mozilla::detail::nsTStringRepr<T>& aLhs,
const mozilla::detail::nsTStringRepr<T>& aRhs) {
return !aLhs.Equals(aRhs);
}
template <typename T>
inline bool operator!=(const mozilla::detail::nsTStringRepr<T>& aLhs,
const T* aRhs) {
inline constexpr bool operator!=(const mozilla::detail::nsTStringRepr<T>& aLhs,
const T* aRhs) {
return !aLhs.Equals(aRhs);
}

View File

@ -2446,6 +2446,25 @@ CONVERSION_BENCH(PerfUTF8toUTF16VIHundred, CopyUTF8toUTF16, mViHundredUtf8,
CONVERSION_BENCH(PerfUTF8toUTF16VIThousand, CopyUTF8toUTF16, mViThousandUtf8,
nsAutoString);
// Tests for usability of nsTLiteralString in constant expressions.
static_assert(NS_LITERAL_STRING("").IsEmpty());
constexpr auto testStringA = NS_LITERAL_STRING("a");
static_assert(!testStringA.IsEmpty());
static_assert(!testStringA.IsVoid());
static_assert(testStringA.IsLiteral());
static_assert(testStringA.IsTerminated());
static_assert(testStringA.GetDataFlags() ==
(nsLiteralString::DataFlags::LITERAL |
nsLiteralString::DataFlags::TERMINATED));
static_assert(*testStringA.Data() == 'a');
static_assert(1 == testStringA.Length());
static_assert(testStringA.CharAt(0) == 'a');
static_assert(testStringA[0] == 'a');
static_assert(*testStringA.BeginReading() == 'a');
static_assert(*testStringA.EndReading() == 0);
static_assert(testStringA.EndReading() - testStringA.BeginReading() == 1);
} // namespace TestStrings
#if defined(__clang__) && (__clang_major__ >= 6)