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(size_t rows,size_t cols,size_t alignment)23   AlignedArray(size_t rows, size_t cols, size_t alignment)
24       : rows_(rows),
25         cols_(cols) {
26     RTC_CHECK_GT(alignment, 0u);
27     head_row_ = static_cast<T**>(AlignedMalloc(rows_ * sizeof(*head_row_),
28                                                alignment));
29     for (size_t i = 0; i < rows_; ++i) {
30       head_row_[i] = static_cast<T*>(AlignedMalloc(cols_ * sizeof(**head_row_),
31                                                    alignment));
32     }
33   }
34 
~AlignedArray()35   ~AlignedArray() {
36     for (size_t i = 0; i < rows_; ++i) {
37       AlignedFree(head_row_[i]);
38     }
39     AlignedFree(head_row_);
40   }
41 
Array()42   T* const* Array() {
43     return head_row_;
44   }
45 
Array()46   const T* const* Array() const {
47     return head_row_;
48   }
49 
Row(size_t row)50   T* Row(size_t row) {
51     RTC_CHECK_LE(row, rows_);
52     return head_row_[row];
53   }
54 
Row(size_t row)55   const T* Row(size_t row) const {
56     RTC_CHECK_LE(row, rows_);
57     return head_row_[row];
58   }
59 
At(size_t row,size_t col)60   T& At(size_t row, size_t col) {
61     RTC_CHECK_LE(col, cols_);
62     return Row(row)[col];
63   }
64 
At(size_t row,size_t col)65   const T& At(size_t row, size_t col) const {
66     RTC_CHECK_LE(col, cols_);
67     return Row(row)[col];
68   }
69 
rows()70   size_t rows() const {
71     return rows_;
72   }
73 
cols()74   size_t cols() const {
75     return cols_;
76   }
77 
78  private:
79   size_t rows_;
80   size_t cols_;
81   T** head_row_;
82 };
83 
84 }  // namespace webrtc
85 
86 #endif  // WEBRTC_SYSTEM_WRAPPERS_INCLUDE_ALIGNED_ARRAY_
87