mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-29 11:57:32 +09:00
Add mozilla::Span
This commit is contained in:
parent
27106783ed
commit
037afae5e6
10 changed files with 3386 additions and 0 deletions
|
|
@ -19,6 +19,7 @@
|
|||
#include "mozilla/Move.h"
|
||||
#include "mozilla/ReverseIterator.h"
|
||||
#include "mozilla/TypeTraits.h"
|
||||
#include "mozilla/Span.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
|
@ -1112,6 +1113,18 @@ public:
|
|||
const_reverse_iterator rend() const { return const_reverse_iterator(begin()); }
|
||||
const_reverse_iterator crend() const { return rend(); }
|
||||
|
||||
// Span integration
|
||||
|
||||
operator mozilla::Span<elem_type>()
|
||||
{
|
||||
return mozilla::Span<elem_type>(Elements(), Length());
|
||||
}
|
||||
|
||||
operator mozilla::Span<const elem_type>() const
|
||||
{
|
||||
return mozilla::Span<const elem_type>(Elements(), Length());
|
||||
}
|
||||
|
||||
//
|
||||
// Search methods
|
||||
//
|
||||
|
|
@ -1336,6 +1349,16 @@ protected:
|
|||
return ReplaceElementsAt<Item, ActualAlloc>(
|
||||
aStart, aCount, aArray.Elements(), aArray.Length());
|
||||
}
|
||||
|
||||
template<class Item, typename ActualAlloc = Alloc>
|
||||
elem_type* ReplaceElementsAt(index_type aStart,
|
||||
size_type aCount,
|
||||
mozilla::Span<const Item> aSpan)
|
||||
{
|
||||
return ReplaceElementsAt<Item, ActualAlloc>(
|
||||
aStart, aCount, aSpan.Elements(), aSpan.Length());
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
template<class Item>
|
||||
|
|
@ -1347,6 +1370,15 @@ public:
|
|||
return ReplaceElementsAt<Item, FallibleAlloc>(aStart, aCount, aArray);
|
||||
}
|
||||
|
||||
template<class Item>
|
||||
MOZ_MUST_USE elem_type* ReplaceElementsAt(index_type aStart,
|
||||
size_type aCount,
|
||||
mozilla::Span<const Item> aSpan,
|
||||
const mozilla::fallible_t&)
|
||||
{
|
||||
return ReplaceElementsAt<Item, FallibleAlloc>(aStart, aCount, aSpan);
|
||||
}
|
||||
|
||||
// A variation on the ReplaceElementsAt method defined above.
|
||||
protected:
|
||||
template<class Item, typename ActualAlloc = Alloc>
|
||||
|
|
@ -1399,6 +1431,15 @@ protected:
|
|||
return ReplaceElementsAt<Item, ActualAlloc>(
|
||||
aIndex, 0, aArray.Elements(), aArray.Length());
|
||||
}
|
||||
|
||||
template<class Item, typename ActualAlloc = Alloc>
|
||||
elem_type* InsertElementsAt(index_type aIndex,
|
||||
mozilla::Span<const Item> aSpan)
|
||||
{
|
||||
return ReplaceElementsAt<Item, ActualAlloc>(
|
||||
aIndex, 0, aSpan.Elements(), aSpan.Length());
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
template<class Item, class Allocator>
|
||||
|
|
@ -1425,6 +1466,14 @@ public:
|
|||
return InsertElementAt<FallibleAlloc>(aIndex);
|
||||
}
|
||||
|
||||
template<class Item>
|
||||
MOZ_MUST_USE elem_type* InsertElementsAt(index_type aIndex,
|
||||
mozilla::Span<const Item> aSpan,
|
||||
const mozilla::fallible_t&)
|
||||
{
|
||||
return InsertElementsAt<Item, FallibleAlloc>(aIndex, aSpan);
|
||||
}
|
||||
|
||||
// Insert a new element, move constructing if possible.
|
||||
protected:
|
||||
template<class Item, typename ActualAlloc = Alloc>
|
||||
|
|
@ -1526,6 +1575,13 @@ protected:
|
|||
template<class Item, typename ActualAlloc = Alloc>
|
||||
elem_type* AppendElements(const Item* aArray, size_type aArrayLen);
|
||||
|
||||
template<class Item, typename ActualAlloc = Alloc>
|
||||
elem_type* AppendElements(mozilla::Span<const Item> aSpan)
|
||||
{
|
||||
return AppendElements<Item, FallibleAlloc>(aSpan.Elements(),
|
||||
aSpan.Length());
|
||||
}
|
||||
|
||||
public:
|
||||
|
||||
template<class Item>
|
||||
|
|
@ -1536,6 +1592,15 @@ public:
|
|||
return AppendElements<Item, FallibleAlloc>(aArray, aArrayLen);
|
||||
}
|
||||
|
||||
template<class Item>
|
||||
/* MOZ_MUST_USE */
|
||||
elem_type* AppendElements(mozilla::Span<const Item> aSpan,
|
||||
const mozilla::fallible_t&)
|
||||
{
|
||||
return AppendElements<Item, FallibleAlloc>(aSpan.Elements(),
|
||||
aSpan.Length());
|
||||
}
|
||||
|
||||
// A variation on the AppendElements method defined above.
|
||||
protected:
|
||||
template<class Item, class Allocator, typename ActualAlloc = Alloc>
|
||||
|
|
@ -2347,6 +2412,25 @@ struct nsTArray_CopyChooser<AutoTArray<E, N>>
|
|||
typedef nsTArray_CopyWithConstructors<AutoTArray<E, N>> Type;
|
||||
};
|
||||
|
||||
// Span integration
|
||||
namespace mozilla {
|
||||
|
||||
template<class ElementType, class TArrayAlloc>
|
||||
Span<ElementType>
|
||||
MakeSpan(nsTArray_Impl<ElementType, TArrayAlloc>& aTArray)
|
||||
{
|
||||
return aTArray;
|
||||
}
|
||||
|
||||
template<class ElementType, class TArrayAlloc>
|
||||
Span<const ElementType>
|
||||
MakeSpan(const nsTArray_Impl<ElementType, TArrayAlloc>& aTArray)
|
||||
{
|
||||
return aTArray;
|
||||
}
|
||||
|
||||
} // namespace mozilla
|
||||
|
||||
// Assert that AutoTArray doesn't have any extra padding inside.
|
||||
//
|
||||
// It's important that the data stored in this auto array takes up a multiple of
|
||||
|
|
|
|||
|
|
@ -7,6 +7,8 @@
|
|||
|
||||
#include "mozilla/Casting.h"
|
||||
#include "mozilla/MemoryReporting.h"
|
||||
#include "mozilla/IntegerTypeTraits.h"
|
||||
#include "mozilla/Span.h"
|
||||
|
||||
#ifndef MOZILLA_INTERNAL_API
|
||||
#error Cannot use internal string classes without MOZILLA_INTERNAL_API defined. Use the frozen header nsStringAPI.h instead.
|
||||
|
|
@ -798,6 +800,68 @@ public:
|
|||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Span integration
|
||||
*/
|
||||
|
||||
operator mozilla::Span<char_type>()
|
||||
{
|
||||
return mozilla::MakeSpan(BeginWriting(), Length());
|
||||
}
|
||||
|
||||
operator mozilla::Span<const char_type>() const
|
||||
{
|
||||
return mozilla::MakeSpan(BeginReading(), Length());
|
||||
}
|
||||
|
||||
void Append(mozilla::Span<const char_type> aSpan)
|
||||
{
|
||||
auto len = aSpan.Length();
|
||||
MOZ_RELEASE_ASSERT(len <= mozilla::MaxValue<size_type>::value);
|
||||
Append(aSpan.Elements(), len);
|
||||
}
|
||||
|
||||
MOZ_MUST_USE bool Append(mozilla::Span<const char_type> aSpan,
|
||||
const fallible_t& aFallible)
|
||||
{
|
||||
auto len = aSpan.Length();
|
||||
if (len > mozilla::MaxValue<size_type>::value) {
|
||||
return false;
|
||||
}
|
||||
return Append(aSpan.Elements(), len, aFallible);
|
||||
}
|
||||
|
||||
#if !defined(CharT_is_PRUnichar)
|
||||
operator mozilla::Span<uint8_t>()
|
||||
{
|
||||
return mozilla::MakeSpan(reinterpret_cast<uint8_t*>(BeginWriting()),
|
||||
Length());
|
||||
}
|
||||
|
||||
operator mozilla::Span<const uint8_t>() const
|
||||
{
|
||||
return mozilla::MakeSpan(reinterpret_cast<const uint8_t*>(BeginReading()),
|
||||
Length());
|
||||
}
|
||||
|
||||
void Append(mozilla::Span<const uint8_t> aSpan)
|
||||
{
|
||||
auto len = aSpan.Length();
|
||||
MOZ_RELEASE_ASSERT(len <= mozilla::MaxValue<size_type>::value);
|
||||
Append(reinterpret_cast<const char*>(aSpan.Elements()), len);
|
||||
}
|
||||
|
||||
MOZ_MUST_USE bool Append(mozilla::Span<const uint8_t> aSpan,
|
||||
const fallible_t& aFallible)
|
||||
{
|
||||
auto len = aSpan.Length();
|
||||
if (len > mozilla::MaxValue<size_type>::value) {
|
||||
return false;
|
||||
}
|
||||
return Append(
|
||||
reinterpret_cast<const char*>(aSpan.Elements()), len, aFallible);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* string data is never null, but can be marked void. if true, the
|
||||
|
|
@ -1184,3 +1248,22 @@ operator>(const nsTSubstring_CharT::base_string_type& aLhs,
|
|||
{
|
||||
return Compare(aLhs, aRhs) > 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Span integration
|
||||
*/
|
||||
namespace mozilla {
|
||||
|
||||
inline Span<CharT>
|
||||
MakeSpan(nsTSubstring_CharT& aString)
|
||||
{
|
||||
return aString;
|
||||
}
|
||||
|
||||
inline Span<const CharT>
|
||||
MakeSpan(const nsTSubstring_CharT& aString)
|
||||
{
|
||||
return aString;
|
||||
}
|
||||
|
||||
} // namespace mozilla
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue