Unreviewed, rolling out r206522.
[WebKit-https.git] / Source / JavaScriptCore / runtime / GenericOffset.h
1 /*
2  * Copyright (C) 2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
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.
12  *
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. 
24  */
25
26 #pragma once
27
28 #include <limits.h>
29 #include <wtf/Assertions.h>
30
31 namespace JSC {
32
33 // A mixin for creating the various kinds of variable offsets that our engine supports.
34 template<typename T>
35 class GenericOffset {
36     WTF_MAKE_FAST_ALLOCATED;
37 public:
38     static const unsigned invalidOffset = UINT_MAX;
39     
40     GenericOffset()
41         : m_offset(invalidOffset)
42     {
43     }
44     
45     explicit GenericOffset(unsigned offset)
46         : m_offset(offset)
47     {
48     }
49     
50     bool operator!() const { return m_offset == invalidOffset; }
51     
52     unsigned offsetUnchecked() const
53     {
54         return m_offset;
55     }
56     
57     unsigned offset() const
58     {
59         ASSERT(m_offset != invalidOffset);
60         return m_offset;
61     }
62     
63     bool operator==(const T& other) const
64     {
65         return m_offset == other.offsetUnchecked();
66     }
67     bool operator!=(const T& other) const
68     {
69         return m_offset != other.offsetUnchecked();
70     }
71     bool operator<(const T& other) const
72     {
73         return m_offset < other.offsetUnchecked();
74     }
75     bool operator>(const T& other) const
76     {
77         return m_offset > other.offsetUnchecked();
78     }
79     bool operator<=(const T& other) const
80     {
81         return m_offset <= other.offsetUnchecked();
82     }
83     bool operator>=(const T& other) const
84     {
85         return m_offset >= other.offsetUnchecked();
86     }
87     
88     T operator+(int value) const
89     {
90         return T(offset() + value);
91     }
92     T operator-(int value) const
93     {
94         return T(offset() - value);
95     }
96     T& operator+=(int value)
97     {
98         return *this = *this + value;
99     }
100     T& operator-=(int value)
101     {
102         return *this = *this - value;
103     }
104     
105 private:
106     unsigned m_offset;
107 };
108
109 } // namespace JSC