diff --git a/octa/array.hh b/octa/array.hh index e06c937..a8508f1 100644 --- a/octa/array.hh +++ b/octa/array.hh @@ -29,8 +29,14 @@ struct Array { T &operator[](Size i) { return p_buf[i]; } const T &operator[](Size i) const { return p_buf[i]; } - T &at(Size i) { return p_buf[i]; } - const T &at(Size i) const { return p_buf[i]; } + T *at(Size i) { + if (!in_range(i)) return nullptr; + return &p_buf[i]; + } + const T *at(Size i) const { + if (!in_range(i)) return nullptr; + return &p_buf[i]; + } T &front() { return p_buf[0]; } const T &front() const { return p_buf[0]; } diff --git a/octa/vector.hh b/octa/vector.hh index cce4f39..f5da0c2 100644 --- a/octa/vector.hh +++ b/octa/vector.hh @@ -288,8 +288,14 @@ public: T &operator[](Size i) { return p_buf.first()[i]; } const T &operator[](Size i) const { return p_buf.first()[i]; } - T &at(Size i) { return p_buf.first()[i]; } - const T &at(Size i) const { return p_buf.first()[i]; } + T *at(Size i) { + if (!in_range(i)) return nullptr; + return &p_buf.first()[i]; + } + const T *at(Size i) const { + if (!in_range(i)) return nullptr; + return &p_buf.first()[i]; + } T &push(const T &v) { if (p_len == p_cap) reserve(p_len + 1); diff --git a/tests/array.cc b/tests/array.cc index 558f90f..66b4619 100644 --- a/tests/array.cc +++ b/tests/array.cc @@ -14,8 +14,8 @@ int main() { assert(x[0] == 2); assert(x[2] == 8); - assert(x.at(0) == x[0]); - assert(x.at(3) == x[3]); + assert(*(x.at(0)) == x[0]); + assert(*(x.at(3)) == x[3]); assert(x.size() == 5); diff --git a/tests/vector.cc b/tests/vector.cc index f6c34a1..8a7c8d6 100644 --- a/tests/vector.cc +++ b/tests/vector.cc @@ -14,8 +14,8 @@ int main() { assert(x[0] == 5); assert(x[2] == 15); - assert(x.at(0) == x[0]); - assert(x.at(3) == x[3]); + assert(*(x.at(0)) == x[0]); + assert(*(x.at(3)) == x[3]); assert(x.data()[0] == x[0]);