summaryrefslogtreecommitdiff
path: root/xpcom/glue
diff options
context:
space:
mode:
authortrav90 <travawine@palemoon.org>2018-10-06 17:29:50 -0500
committertrav90 <travawine@palemoon.org>2018-10-06 17:29:50 -0500
commitc2fa384d666aea1b119736f33116ac09e870fda0 (patch)
tree643a1009d32e68df792526c79db4a4921a7b02ec /xpcom/glue
parent323cb98de19b6f63b52d3fde5d7144712384c058 (diff)
downloaduxp-c2fa384d666aea1b119736f33116ac09e870fda0.tar.gz
Add mozilla::Span
Diffstat (limited to 'xpcom/glue')
-rw-r--r--xpcom/glue/nsTArray.h84
1 files changed, 84 insertions, 0 deletions
diff --git a/xpcom/glue/nsTArray.h b/xpcom/glue/nsTArray.h
index ca74a41f76..c86772a8e9 100644
--- a/xpcom/glue/nsTArray.h
+++ b/xpcom/glue/nsTArray.h
@@ -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