//E is an array expression - eg array<double> or array<double>+array<int>
//S is a scalar data type - eg int
//T must be a C plain old data type, usually numerical
template <class T>
class array
{
public:
typedef T value_type;
size_t size(); //return size of array
T* data(); //return pointer to array's contents
explicit array(size_t s=0); //construct array of size s
array(size_t s, T val); //construct and initialise array of size s
void resize(size_t s); //resize array, data undefined
array& array(const E& x); //copy constructor
array& operator=(const E& x); //assignment or broadcast
T& operator[](size_t i); //reference an element
T& operator[](const E& i); //vector indexing
operator+() etc. //see below
};