author | Hiroyuki Ikezoe <hikezoe@mozilla.com> |
Fri, 10 Mar 2017 11:53:17 +0900 | |
changeset 346895 | c6b334aa177cf9a9196102ecbe661656d3975cb1 |
parent 346894 | d6ab48ced3b85d7e8b2de403dc32bbeaaaae1870 |
child 346896 | d018acf339b35c08cdbc986a8fb84bdbb5acbc4e |
push id | 31480 |
push user | cbook@mozilla.com |
push date | Fri, 10 Mar 2017 10:37:06 +0000 |
treeherder | mozilla-central@e18d3dd20e8d [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | birtles |
bugs | 1341985 |
milestone | 55.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
--- 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,