1 // Copyright 2018 The RE2 Authors. All Rights Reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 #ifndef RE2_POD_ARRAY_H_ 6 #define RE2_POD_ARRAY_H_ 7 8 #include <memory> 9 #include <type_traits> 10 11 namespace re2 { 12 13 template <typename T> 14 class PODArray { 15 public: 16 static_assert(std::is_trivial<T>::value && std::is_standard_layout<T>::value, 17 "T must be POD"); 18 PODArray()19 PODArray() 20 : ptr_() {} PODArray(int len)21 explicit PODArray(int len) 22 : ptr_(std::allocator<T>().allocate(len), Deleter(len)) {} 23 data()24 T* data() const { 25 return ptr_.get(); 26 } 27 size()28 int size() const { 29 return ptr_.get_deleter().len_; 30 } 31 32 T& operator[](int pos) const { 33 return ptr_[pos]; 34 } 35 36 private: 37 struct Deleter { DeleterDeleter38 Deleter() 39 : len_(0) {} DeleterDeleter40 explicit Deleter(int len) 41 : len_(len) {} 42 operatorDeleter43 void operator()(T* ptr) const { 44 std::allocator<T>().deallocate(ptr, len_); 45 } 46 47 int len_; 48 }; 49 50 std::unique_ptr<T[], Deleter> ptr_; 51 }; 52 53 } // namespace re2 54 55 #endif // RE2_POD_ARRAY_H_ 56