comparison osx/include/kj/vector.h @ 147:45360b968bf4

Cap'n Proto v0.6 + build for OSX
author Chris Cannam <cannam@all-day-breakfast.com>
date Mon, 22 May 2017 10:01:37 +0100
parents 41e769c91eca
children
comparison
equal deleted inserted replaced
146:206f0eb279b8 147:45360b968bf4
93 builder.removeLast(); 93 builder.removeLast();
94 } 94 }
95 95
96 inline void resize(size_t size) { 96 inline void resize(size_t size) {
97 if (size > builder.capacity()) grow(size); 97 if (size > builder.capacity()) grow(size);
98 while (builder.size() < size) { 98 builder.resize(size);
99 builder.add(T());
100 }
101 while (builder.size() > size) {
102 builder.removeLast();
103 }
104 } 99 }
105 100
106 inline void operator=(decltype(nullptr)) { 101 inline void operator=(decltype(nullptr)) {
107 builder = nullptr; 102 builder = nullptr;
108 } 103 }
112 builder.removeLast(); 107 builder.removeLast();
113 } 108 }
114 } 109 }
115 110
116 inline void truncate(size_t size) { 111 inline void truncate(size_t size) {
117 while (builder.size() > size) { 112 builder.truncate(size);
118 builder.removeLast(); 113 }
114
115 inline void reserve(size_t size) {
116 if (size > builder.capacity()) {
117 setCapacity(size);
119 } 118 }
120 } 119 }
121 120
122 private: 121 private:
123 ArrayBuilder<T> builder; 122 ArrayBuilder<T> builder;
124 123
125 void grow(size_t minCapacity = 0) { 124 void grow(size_t minCapacity = 0) {
126 setCapacity(kj::max(minCapacity, capacity() == 0 ? 4 : capacity() * 2)); 125 setCapacity(kj::max(minCapacity, capacity() == 0 ? 4 : capacity() * 2));
127 } 126 }
128 void setCapacity(size_t newSize) { 127 void setCapacity(size_t newSize) {
128 if (builder.size() > newSize) {
129 builder.truncate(newSize);
130 }
129 ArrayBuilder<T> newBuilder = heapArrayBuilder<T>(newSize); 131 ArrayBuilder<T> newBuilder = heapArrayBuilder<T>(newSize);
130 size_t moveCount = kj::min(newSize, builder.size()); 132 newBuilder.addAll(kj::mv(builder));
131 for (size_t i = 0; i < moveCount; i++) {
132 newBuilder.add(kj::mv(builder[i]));
133 }
134 builder = kj::mv(newBuilder); 133 builder = kj::mv(newBuilder);
135 } 134 }
136 }; 135 };
137 136
138 template <typename T> 137 template <typename T>