Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma once
- #include <initializer_list>
- template <typename T>
- class MyArray
- {
- public:
- explicit MyArray(size_t sz) {
- head = new T[sz + reserved];
- szUsed = sz;
- szAll = szUsed + reserved;
- }
- MyArray(std::initializer_list<T> l) : MyArray( l.size() ) {
- for (int i = 0; i < l.size(); ++i ) {
- *(head + i) = *(l.begin() + i);
- std::cout << "elem (il constructor) " << *(head + i) << std::endl;
- }
- }
- MyArray(const MyArray& a) : MyArray(a.szUsed) {
- for (int i = 0; i < a.szUsed; ++i) {
- *(head + i) = *(a.head + i);
- std::cout << "elem (copy constructor) " << *(head + i) << std::endl;
- }
- }
- ~MyArray() {
- delete[] head;
- }
- template<typename V>
- void push(V&& val) {
- if (szUsed == szAll) {
- ++szAll;
- T* newHead = new T[szAll];
- for (int i = 0; i < szAll - 1; ++i) {
- *(newHead + i) = std::move(*(head + i));
- }
- delete[] head;
- head = newHead;
- }
- *(head + szUsed) = std::forward<V>(val);
- ++szUsed;
- std::cout << "elem " << *(head + szUsed - 1) << " pushed" << std::endl;
- }
- T pop() {
- if (szUsed) {
- szUsed--;
- std::cout << "elem " << *(head + szUsed) << " poped" << std::endl;
- return *(head + szUsed);
- }
- else
- throw std::out_of_range("MyArray::pop - array is empty");
- }
- auto operator=(const MyArray& a) {
- if (szAll < a.szUsed) {
- delete[] head;
- szAll = a.szUsed;
- head = new T[a.szUsed];
- }
- szUsed = a.szUsed;
- for (int i = 0; i < szUsed; ++i) {
- *(head + i) = *(a.head + i);
- }
- }
- auto operator=(MyArray&& a) {
- if (szAll < a.szUsed) {
- delete[] head;
- szAll = a.szUsed;
- head = new T[a.szUsed];
- }
- szUsed = a.szUsed;
- for (int i = 0; i < szUsed; ++i) {
- *(head + i) = std::move( *(a.head + i) );
- }
- }
- private:
- static const size_t reserved = 10;
- T* head = nullptr;
- size_t szAll = 0;
- size_t szUsed = 0;
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement