2 * Copyright (C) 2012 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 #ifndef PropertyOffset_h
27 #define PropertyOffset_h
29 #include <wtf/Platform.h>
30 #include <wtf/StdLibExtras.h>
34 typedef int PropertyOffset
;
36 static const PropertyOffset invalidOffset
= -1;
37 static const PropertyOffset firstOutOfLineOffset
= 100;
39 // Declare all of the functions because they tend to do forward calls.
40 inline void checkOffset(PropertyOffset
);
41 inline void checkOffset(PropertyOffset
, int inlineCapacity
);
42 inline void validateOffset(PropertyOffset
);
43 inline void validateOffset(PropertyOffset
, int inlineCapacity
);
44 inline bool isValidOffset(PropertyOffset
);
45 inline bool isInlineOffset(PropertyOffset
);
46 inline bool isOutOfLineOffset(PropertyOffset
);
47 inline size_t offsetInInlineStorage(PropertyOffset
);
48 inline size_t offsetInOutOfLineStorage(PropertyOffset
);
49 inline size_t offsetInRespectiveStorage(PropertyOffset
);
50 inline size_t numberOfOutOfLineSlotsForLastOffset(PropertyOffset
);
51 inline size_t numberOfSlotsForLastOffset(PropertyOffset
, int inlineCapacity
);
53 inline void checkOffset(PropertyOffset offset
)
56 ASSERT(offset
>= invalidOffset
);
59 inline void checkOffset(PropertyOffset offset
, int inlineCapacity
)
62 UNUSED_PARAM(inlineCapacity
);
63 ASSERT(offset
>= invalidOffset
);
64 ASSERT(offset
== invalidOffset
65 || offset
< inlineCapacity
66 || isOutOfLineOffset(offset
));
69 inline void validateOffset(PropertyOffset offset
)
72 ASSERT(isValidOffset(offset
));
75 inline void validateOffset(PropertyOffset offset
, int inlineCapacity
)
77 checkOffset(offset
, inlineCapacity
);
78 ASSERT(isValidOffset(offset
));
81 inline bool isValidOffset(PropertyOffset offset
)
84 return offset
!= invalidOffset
;
87 inline bool isInlineOffset(PropertyOffset offset
)
90 return offset
< firstOutOfLineOffset
;
93 inline bool isOutOfLineOffset(PropertyOffset offset
)
96 return !isInlineOffset(offset
);
99 inline size_t offsetInInlineStorage(PropertyOffset offset
)
101 validateOffset(offset
);
102 ASSERT(isInlineOffset(offset
));
106 inline size_t offsetInOutOfLineStorage(PropertyOffset offset
)
108 validateOffset(offset
);
109 ASSERT(isOutOfLineOffset(offset
));
110 return -static_cast<ptrdiff_t>(offset
- firstOutOfLineOffset
) - 1;
113 inline size_t offsetInRespectiveStorage(PropertyOffset offset
)
115 if (isInlineOffset(offset
))
116 return offsetInInlineStorage(offset
);
117 return offsetInOutOfLineStorage(offset
);
120 inline size_t numberOfOutOfLineSlotsForLastOffset(PropertyOffset offset
)
123 if (offset
< firstOutOfLineOffset
)
125 return offset
- firstOutOfLineOffset
+ 1;
128 inline size_t numberOfSlotsForLastOffset(PropertyOffset offset
, int inlineCapacity
)
130 checkOffset(offset
, inlineCapacity
);
131 if (offset
< inlineCapacity
)
133 return inlineCapacity
+ numberOfOutOfLineSlotsForLastOffset(offset
);
136 inline PropertyOffset
offsetForPropertyNumber(int propertyNumber
, int inlineCapacity
)
138 PropertyOffset offset
= propertyNumber
;
139 if (offset
>= inlineCapacity
) {
140 offset
+= firstOutOfLineOffset
;
141 offset
-= inlineCapacity
;
148 #endif // PropertyOffset_h