UninitializedArray.h 1.3 KB

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