Replace aos::SizedArray with absl::InlinedVector
Change-Id: I4dae096c5079afa3135e3a1cb7cb17e2789275e6
Signed-off-by: Tyler Chatow <tchatow@gmail.com>
diff --git a/aos/containers/sized_array.h b/aos/containers/sized_array.h
index 4264cf6..8a8d2de 100644
--- a/aos/containers/sized_array.h
+++ b/aos/containers/sized_array.h
@@ -1,134 +1,28 @@
#ifndef AOS_CONTAINERS_SIZED_ARRAY_H_
#define AOS_CONTAINERS_SIZED_ARRAY_H_
-#include <array>
-#include <cstddef>
+#include "absl/container/inlined_vector.h"
namespace aos {
-// An array along with a variable size. This is a simple variable-size container
-// with a fixed maximum size.
-//
-// Note that it default-constructs N T instances at construction time. This
-// simplifies the internal bookkeeping a lot (I believe this can be
-// all-constexpr in C++17), but makes it a poor choice for complex T.
-template <typename T, size_t N>
-class SizedArray {
- private:
- using array = std::array<T, N>;
-
+// Minimal compliant allocator whose allocating operations are all fatal.
+template <typename T>
+class FatalAllocator {
public:
- using value_type = typename array::value_type;
- using size_type = typename array::size_type;
- using difference_type = typename array::difference_type;
- using reference = typename array::reference;
- using const_reference = typename array::const_reference;
- using pointer = typename array::pointer;
- using const_pointer = typename array::const_pointer;
- using iterator = typename array::iterator;
- using const_iterator = typename array::const_iterator;
- using reverse_iterator = typename array::reverse_iterator;
- using const_reverse_iterator = typename array::const_reverse_iterator;
+ using value_type = T;
- constexpr SizedArray() = default;
- SizedArray(const SizedArray &) = default;
- SizedArray(SizedArray &&) = default;
- SizedArray &operator=(const SizedArray &) = default;
- SizedArray &operator=(SizedArray &&) = default;
+ [[nodiscard, noreturn]] T *allocate(std::size_t) { __builtin_trap(); }
- bool operator==(const SizedArray &other) const {
- if (other.size() != size()) {
- return false;
- }
- for (size_t i = 0; i < size(); ++i) {
- if (other[i] != (*this)[i]) {
- return false;
- }
- }
- return true;
- }
- bool operator!=(const SizedArray &other) const {
- return !(*this == other);
- }
-
- reference at(size_t i) {
- check_index(i);
- return array_.at(i);
- }
- const_reference at(size_t i) const {
- check_index(i);
- return array_.at(i);
- }
-
- reference operator[](size_t i) { return array_[i]; }
- const_reference operator[](size_t i) const { return array_[i]; }
-
- reference front() { return array_.front(); }
- const_reference front() const { return array_.front(); }
-
- reference back() { return array_[size_ - 1]; }
- const_reference back() const { return array_[size_ - 1]; }
-
- T *data() { return array_.data(); }
- const T *data() const { return array_.data(); }
-
- iterator begin() { return array_.begin(); }
- const_iterator begin() const { return array_.begin(); }
- const_iterator cbegin() const { return array_.cbegin(); }
-
- iterator end() { return array_.begin() + size_; }
- const_iterator end() const { return array_.begin() + size_; }
- const_iterator cend() const { return array_.cbegin() + size_; }
-
- reverse_iterator rbegin() { return array_.rend() - size_; }
- const_reverse_iterator rbegin() const { return array_.rend() - size_; }
- const_reverse_iterator crbegin() const { return array_.crend() - size_; }
-
- reverse_iterator rend() { return array_.rend(); }
- const_reverse_iterator rend() const { return array_.rend(); }
- const_reverse_iterator crend() const { return array_.crend(); }
-
- bool empty() const { return size_ == 0; }
- bool full() const { return size() == max_size(); }
-
- size_t size() const { return size_; }
- constexpr size_t max_size() const { return array_.max_size(); }
-
- void push_back(const T &t) {
- array_.at(size_) = t;
- ++size_;
- }
- void push_back(T &&t) {
- array_.at(size_) = std::move(t);
- ++size_;
- }
-
- void pop_back() {
- if (empty()) {
- __builtin_trap();
- }
- --size_;
- }
-
- void clear() { size_ = 0; }
-
- // These allow access to the underlying storage. The data here may be outside
- // the current logical extents of the container.
- const array &backing_array() const { return array_; }
- array *mutable_backing_array() { return &array_; }
- void set_size(size_t size) { size_ = size; }
-
- private:
- void check_index(size_t i) const {
- if (i >= size_) {
- __builtin_trap();
- }
- }
-
- array array_;
- size_t size_ = 0;
+ [[noreturn]] void deallocate(T *, std::size_t) { __builtin_trap(); }
};
+// Reuse the logic from absl::InlinedVector for a statically allocated,
+// dynamically sized list of values. InlinedVector's default behavior is to
+// allocate from the heap when growing beyond the static capacity, make this
+// fatal instead to enforce RT guarantees.
+template <typename T, size_t N>
+using SizedArray = absl::InlinedVector<T, N, FatalAllocator<T>>;
+
} // namespace aos
#endif // AOS_CONTAINERS_SIZED_ARRAY_H_