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