bmalloc: Refactored SegregatedFreeList and BoundaryTag::init
[WebKit-https.git] / Source / bmalloc / bmalloc / FixedVector.h
1 /*
2  * Copyright (C) 2014 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 #ifndef FixedVector_h
27 #define FixedVector_h
28
29 #include "BAssert.h"
30 #include <array>
31 #include <cstddef>
32 #include <type_traits>
33
34 namespace bmalloc {
35
36 // A replacement for std::vector that uses a fixed-sized inline backing store.
37
38 template<typename T, size_t Capacity>
39 class FixedVector {
40     static_assert(std::is_trivially_destructible<T>::value, "FixedVector must have a trivial destructor.");
41 public:
42     FixedVector(const FixedVector&) = delete;
43     FixedVector& operator=(const FixedVector&) = delete;
44
45     FixedVector();
46
47     const T* begin() const { return m_buffer.begin(); }
48     const T* end() const { return begin() + size(); }
49
50     size_t size() const { return m_size; }
51     size_t capacity() const { return Capacity; }
52     
53     T& operator[](size_t);
54
55     void push(const T&);
56     void push(const T*, const T*);
57     T pop();
58
59     void shrink(T*);
60     void shrink(size_t);
61
62     void clear() { shrink(static_cast<size_t>(0)); }
63     bool isEmpty() { return !m_size; }
64
65 private:
66     size_t m_size;
67     std::array<T, Capacity> m_buffer;
68 };
69
70 template<typename T, size_t Capacity>
71 inline FixedVector<T, Capacity>::FixedVector()
72     : m_size(0)
73 {
74 }
75
76 template<typename T, size_t Capacity>
77 inline T& FixedVector<T, Capacity>::operator[](size_t i)
78 {
79     BASSERT(i < m_size);
80     return m_buffer[i];
81 }
82
83 template<typename T, size_t Capacity>
84 inline void FixedVector<T, Capacity>::push(const T& value)
85 {
86     BASSERT(m_size < Capacity);
87     m_buffer[m_size++] = value;
88 }
89
90 template<typename T, size_t Capacity>
91 inline void FixedVector<T, Capacity>::push(const T* begin, const T* end)
92 {
93     for (const T* it = begin; it != end; ++it)
94         push(*it);
95 }
96
97 template<typename T, size_t Capacity>
98 inline T FixedVector<T, Capacity>::pop()
99 {
100     BASSERT(m_size);
101     return m_buffer[--m_size];
102 }
103
104 template<typename T, size_t Capacity>
105 inline void FixedVector<T, Capacity>::shrink(size_t size)
106 {
107     BASSERT(size <= m_size);
108     m_size = size;
109 }
110
111 template<typename T, size_t Capacity>
112 inline void FixedVector<T, Capacity>::shrink(T* end)
113 {
114     shrink(end - begin());
115 }
116
117 } // namespace bmalloc
118
119 #endif // FixedVector_h