xref: /aosp_15_r20/external/regex-re2/util/pod_array.h (revision ccdc9c3e24c519bfa4832a66aa2e83a52c19f295)
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