#include <iostream>
#include <vector>
using namespace std;



template<typename T> class SVector : public vector<T>
{
	class ElementProxy {
	public:
		T* ptr;
		ElementProxy(T* ptr) : ptr(ptr)
		{}

		ElementProxy& operator=(const T& input) {
			if (ptr) {
				*ptr = input;
			}
			return *this;
		}

		ElementProxy& operator=(T&& input) {
			if (ptr) {
				*ptr = move(input);
			}
			return *this;
		}

		operator T() {
			if (ptr) {
				return *ptr;
			}
			else {
				return T();
			}
		}
	};

	class SizeProxy
	{
	public:
		operator size_t() {
			return sptr()->size();
		}

		SizeProxy& operator=(size_t input) {
			sptr()->resize(input);
			return *this;
		}

		SVector* sptr()
		{
			return (SVector*)((char*)this - offsetof(SVector<T>, count));
		}
	};


public:
	SizeProxy count;
	ElementProxy operator[](size_t index) {
		if (index < this->size())
			return ElementProxy(this->data() + index);
		else
			return ElementProxy(nullptr);
	}

	
};


int main()
{
    cout << "Hello World!\n"; 
	SVector<int> s;
	s.push_back(5);
	s.push_back(43513);
	s.push_back(486);

	s.count = 5;

	SVector<int> b = s;

	for (auto i : b)
	{
		cout << i << endl;
	}

	s[10000000] = 1000000;
	cout << s[10000000] << endl;
}
