Bug 1341985 - Split nsStyleAutoArray into a new header to avoid including nsStyleStruct.h in ServoBindingTypes.h. r?birtles
MozReview-Commit-ID: CMJkds7TKH0
--- a/layout/style/moz.build
+++ b/layout/style/moz.build
@@ -59,16 +59,17 @@ EXPORTS += [
'nsIStyleRuleProcessor.h',
'nsLayoutStylesheetCache.h',
'nsMediaFeatures.h',
'nsMediaList.h',
'nsRuleData.h',
'nsRuleNode.h',
'nsRuleProcessorData.h',
'nsRuleWalker.h',
+ 'nsStyleAutoArray.h',
'nsStyleConsts.h',
'nsStyleContext.h',
'nsStyleCoord.h',
'nsStyleSet.h',
'nsStyleStruct.h',
'nsStyleStructFwd.h',
'nsStyleStructInlines.h',
'nsStyleTransformMatrix.h',
new file mode 100644
--- /dev/null
+++ b/layout/style/nsStyleAutoArray.h
@@ -0,0 +1,78 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef nsStyleAutoArray_h_
+#define nsStyleAutoArray_h_
+
+#include "nsTArray.h"
+#include "mozilla/Assertions.h"
+
+/**
+ * An array of objects, similar to AutoTArray<T,1> but which is memmovable. It
+ * always has length >= 1.
+ */
+template<typename T>
+class nsStyleAutoArray
+{
+public:
+ // This constructor places a single element in mFirstElement.
+ enum WithSingleInitialElement { WITH_SINGLE_INITIAL_ELEMENT };
+ explicit nsStyleAutoArray(WithSingleInitialElement) {}
+ nsStyleAutoArray(const nsStyleAutoArray& aOther) { *this = aOther; }
+ nsStyleAutoArray& operator=(const nsStyleAutoArray& aOther) {
+ mFirstElement = aOther.mFirstElement;
+ mOtherElements = aOther.mOtherElements;
+ return *this;
+ }
+
+ bool operator==(const nsStyleAutoArray& aOther) const {
+ return Length() == aOther.Length() &&
+ mFirstElement == aOther.mFirstElement &&
+ mOtherElements == aOther.mOtherElements;
+ }
+ bool operator!=(const nsStyleAutoArray& aOther) const {
+ return !(*this == aOther);
+ }
+
+ nsStyleAutoArray& operator=(nsStyleAutoArray&& aOther) {
+ mFirstElement = aOther.mFirstElement;
+ mOtherElements.SwapElements(aOther.mOtherElements);
+
+ return *this;
+ }
+
+ size_t Length() const {
+ return mOtherElements.Length() + 1;
+ }
+ const T& operator[](size_t aIndex) const {
+ return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1];
+ }
+ T& operator[](size_t aIndex) {
+ return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1];
+ }
+
+ void EnsureLengthAtLeast(size_t aMinLen) {
+ if (aMinLen > 0) {
+ mOtherElements.EnsureLengthAtLeast(aMinLen - 1);
+ }
+ }
+
+ void SetLengthNonZero(size_t aNewLen) {
+ MOZ_ASSERT(aNewLen > 0);
+ mOtherElements.SetLength(aNewLen - 1);
+ }
+
+ void TruncateLengthNonZero(size_t aNewLen) {
+ MOZ_ASSERT(aNewLen > 0);
+ MOZ_ASSERT(aNewLen <= Length());
+ mOtherElements.TruncateLength(aNewLen - 1);
+ }
+
+private:
+ T mFirstElement;
+ nsTArray<T> mOtherElements;
+};
+
+#endif /* nsStyleAutoArray_h_ */
--- a/layout/style/nsStyleStruct.h
+++ b/layout/style/nsStyleStruct.h
@@ -19,16 +19,17 @@
#include "mozilla/SheetType.h"
#include "mozilla/StaticPtr.h"
#include "mozilla/StyleComplexColor.h"
#include "mozilla/UniquePtr.h"
#include "nsColor.h"
#include "nsCoord.h"
#include "nsMargin.h"
#include "nsFont.h"
+#include "nsStyleAutoArray.h"
#include "nsStyleCoord.h"
#include "nsStyleConsts.h"
#include "nsChangeHint.h"
#include "nsPresContext.h"
#include "nsCOMPtr.h"
#include "nsCOMArray.h"
#include "nsTArray.h"
#include "nsCSSValue.h"
@@ -597,82 +598,16 @@ struct MOZ_NEEDS_MEMMOVABLE_MEMBERS nsSt
FreeByObjectID(mozilla::eArenaObjectID_nsStyleColor, this);
}
// Don't add ANY members to this struct! We can achieve caching in the rule
// tree (rather than the style tree) by letting color stay by itself! -dwh
nscolor mColor; // [inherited]
};
-/**
- * An array of objects, similar to AutoTArray<T,1> but which is memmovable. It
- * always has length >= 1.
- */
-template<typename T>
-class nsStyleAutoArray
-{
-public:
- // This constructor places a single element in mFirstElement.
- enum WithSingleInitialElement { WITH_SINGLE_INITIAL_ELEMENT };
- explicit nsStyleAutoArray(WithSingleInitialElement) {}
- nsStyleAutoArray(const nsStyleAutoArray& aOther) { *this = aOther; }
- nsStyleAutoArray& operator=(const nsStyleAutoArray& aOther) {
- mFirstElement = aOther.mFirstElement;
- mOtherElements = aOther.mOtherElements;
- return *this;
- }
-
- bool operator==(const nsStyleAutoArray& aOther) const {
- return Length() == aOther.Length() &&
- mFirstElement == aOther.mFirstElement &&
- mOtherElements == aOther.mOtherElements;
- }
- bool operator!=(const nsStyleAutoArray& aOther) const {
- return !(*this == aOther);
- }
-
- nsStyleAutoArray& operator=(nsStyleAutoArray&& aOther) {
- mFirstElement = aOther.mFirstElement;
- mOtherElements.SwapElements(aOther.mOtherElements);
-
- return *this;
- }
-
- size_t Length() const {
- return mOtherElements.Length() + 1;
- }
- const T& operator[](size_t aIndex) const {
- return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1];
- }
- T& operator[](size_t aIndex) {
- return aIndex == 0 ? mFirstElement : mOtherElements[aIndex - 1];
- }
-
- void EnsureLengthAtLeast(size_t aMinLen) {
- if (aMinLen > 0) {
- mOtherElements.EnsureLengthAtLeast(aMinLen - 1);
- }
- }
-
- void SetLengthNonZero(size_t aNewLen) {
- MOZ_ASSERT(aNewLen > 0);
- mOtherElements.SetLength(aNewLen - 1);
- }
-
- void TruncateLengthNonZero(size_t aNewLen) {
- MOZ_ASSERT(aNewLen > 0);
- MOZ_ASSERT(aNewLen <= Length());
- mOtherElements.TruncateLength(aNewLen - 1);
- }
-
-private:
- T mFirstElement;
- nsTArray<T> mOtherElements;
-};
-
struct nsStyleImageLayers {
// Indices into kBackgroundLayerTable and kMaskLayerTable
enum {
shorthand = 0,
color,
image,
repeat,
positionX,