#ifndef ICL_DYN_VECTOR_H
#define ICL_DYN_VECTOR_H

#include <valarray>

namespace icl{
  template<class T>
  struct DynVector : public std::valarray<T>{
    DynVector():std::valarray<T>(){}
    explicit DynVector(size_t dim):std::valarray<T>(dim){};
    DynVector(const T &val, int dim):std::valarray<T>(val,dim){}
    DynVector(const T *data, int dim):std::valarray<T>(data,dim){}
    DynVector(const DynVector &v):std::valarray<T>(v){}
    
    
    DynVector(const std::slice_array< T> &a):std::valarray<T>(a){}
    DynVector(const std::gslice_array< T> &a):std::valarray<T>(a){}
    DynVector(const std::mask_array< T> &a):std::valarray<T>(a){}
    DynVector(const std::indirect_array< T> &a):std::valarray<T>(a){}
    
    void ensureSize(size_t dim){
      if(std::valarray<T>::size() != dim) std::valarray<T>::resize(dim);    
    }
    
    DynVector<T> &operator=(const DynVector<T> &v){
      ensureSize(v.size());
      return std::valarray<T>::operator=(v);
    }
    DynVector<T> &operator=(const T &t){
      return std::valarray<T>::operator=(t); 
    }
    DynVector<T> &operator=(const std::slice_array<T> &a){
      ensureSize(a.size());
      return std::valarray<T>::operator=(a);
    }
    DynVector<T> &operator=(const std::gslice_array<T> &a){ 
      ensureSize(a.size());
      return std::valarray<T>::operator=(a); 
    }
    DynVector<T> &operator=(const std::mask_array<T> &a){
      ensureSize(a.size());
      return std::valarray<T>::operator=(a); 
    }
    DynVector<T> &operator=(const std::indirect_array<T> &a){
      ensureSize(a.size());
      return std::valarray<T>::operator=(a); 
    }
  };
  
}

#endif