1// Copyright 2016 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#pragma once
6
7#include <zircon/assert.h>
8#include <fbl/macros.h>
9
10namespace fbl {
11
12template <typename T>
13class Array {
14public:
15    constexpr Array() : ptr_(nullptr), count_(0U) {}
16    constexpr Array(decltype(nullptr)) : Array() {}
17
18    Array(T* array, size_t count) : ptr_(array), count_(count) {}
19
20    Array(Array&& other) : ptr_(nullptr), count_(other.count_) {
21        ptr_ = other.release();
22    }
23
24    size_t size() const {
25        return count_;
26    }
27
28    ~Array() {
29        reset();
30    }
31
32    Array& operator=(Array&& o) {
33        auto count = o.count_;
34        reset(o.release(), count);
35        return *this;
36    }
37
38    // move semantics only
39    DISALLOW_COPY_AND_ASSIGN_ALLOW_MOVE(Array);
40
41    T* release() {
42        T* t = ptr_;
43        ptr_ = nullptr;
44        count_ = 0;
45        return t;
46    }
47
48    void reset() {
49        reset(nullptr, 0U);
50    }
51
52    void reset(T* t, size_t count) {
53        T* ptr = ptr_;
54        ptr_ = t;
55        count_ = count;
56        delete[] ptr;
57    }
58
59    void swap(Array& other) {
60        T* t = ptr_;
61        ptr_ = other.ptr_;
62        other.ptr_ = t;
63        size_t c = count_;
64        count_ = other.count_;
65        other.count_ = c;
66    }
67
68    T* get() const {
69        return ptr_;
70    }
71
72    explicit operator bool() const {
73        return static_cast<bool>(ptr_);
74    }
75
76    T& operator[](size_t i) const {
77        ZX_DEBUG_ASSERT(i < count_);
78        return ptr_[i];
79    }
80
81    T* begin() const {
82        return ptr_;
83    }
84
85    T* end() const {
86        return &ptr_[count_];
87    }
88
89private:
90    T* ptr_;
91    size_t count_;
92};
93
94}  // namespace fbl
95