UninitializedArray.h 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. #ifndef UNINITIALIZEDARRAY_H
  2. #define UNINITIALIZEDARRAY_H
  3. #include <new>
  4. #include <utility>
  5. template<typename T, int N>
  6. class UninitializedArray final {
  7. char data[sizeof(T) * N];
  8. public:
  9. UninitializedArray() = default;
  10. UninitializedArray(const UninitializedArray&) = delete;
  11. UninitializedArray(UninitializedArray&&) = delete;
  12. UninitializedArray& operator=(const UninitializedArray&) = delete;
  13. UninitializedArray& operator=(UninitializedArray&&) = delete;
  14. T* begin() {
  15. return reinterpret_cast<T*>(data);
  16. }
  17. T* end() {
  18. return begin() + N;
  19. }
  20. const T* begin() const {
  21. return reinterpret_cast<const T*>(data);
  22. }
  23. const T* end() const {
  24. return begin() + N;
  25. }
  26. T& operator[](int index) {
  27. return begin()[index];
  28. }
  29. const T& operator[](int index) const {
  30. return begin()[index];
  31. }
  32. void init(int index, const T& t) {
  33. new(begin() + index) T(t);
  34. }
  35. void init(int index, T&& t) {
  36. new(begin() + index) T(std::move(t));
  37. }
  38. template<typename... Args>
  39. void init(int index, Args&&... args) {
  40. new(begin() + index) T(std::forward<Args>(args)...);
  41. }
  42. void destroy(int index) {
  43. begin()[index].~T();
  44. }
  45. };
  46. #endif