1 /*
2  *  Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_ARRAY_
12 #define WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_ARRAY_
13 
14 #include "webrtc/base/checks.h"
15 #include "webrtc/system_wrappers/include/aligned_malloc.h"
16 
17 namespace webrtc {
18 
19 // Wrapper class for aligned arrays. Every row (and the first dimension) are
20 // aligned to the given byte alignment.
21 template<typename T> class AlignedArray {
22  public:
AlignedArray(int rows,size_t cols,int alignment)23   AlignedArray(int rows, size_t cols, int alignment)
24       : rows_(rows),
25         cols_(cols),
26         alignment_(alignment) {
27     RTC_CHECK_GT(alignment_, 0);
28     head_row_ = static_cast<T**>(AlignedMalloc(rows_ * sizeof(*head_row_),
29                                                alignment_));
30     for (int i = 0; i < rows_; ++i) {
31       head_row_[i] = static_cast<T*>(AlignedMalloc(cols_ * sizeof(**head_row_),
32                                                    alignment_));
33     }
34   }
35 
~AlignedArray()36   ~AlignedArray() {
37     for (int i = 0; i < rows_; ++i) {
38       AlignedFree(head_row_[i]);
39     }
40     AlignedFree(head_row_);
41   }
42 
Array()43   T* const* Array() {
44     return head_row_;
45   }
46 
Array()47   const T* const* Array() const {
48     return head_row_;
49   }
50 
Row(int row)51   T* Row(int row) {
52     RTC_CHECK_LE(row, rows_);
53     return head_row_[row];
54   }
55 
Row(int row)56   const T* Row(int row) const {
57     RTC_CHECK_LE(row, rows_);
58     return head_row_[row];
59   }
60 
At(int row,size_t col)61   T& At(int row, size_t col) {
62     RTC_CHECK_LE(col, cols_);
63     return Row(row)[col];
64   }
65 
At(int row,size_t col)66   const T& At(int row, size_t col) const {
67     RTC_CHECK_LE(col, cols_);
68     return Row(row)[col];
69   }
70 
rows()71   int rows() const {
72     return rows_;
73   }
74 
cols()75   size_t cols() const {
76     return cols_;
77   }
78 
79  private:
80   int rows_;
81   size_t cols_;
82   int alignment_;
83   T** head_row_;
84 };
85 
86 }  // namespace webrtc
87 
88 #endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_ARRAY_
89