#ifndef VECTORREADIN_H
#define VECTORREADIN_H

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

#include <typedefs.h>


/** Read a 1D array into a vector with each element being 2D. */
template<class PT, class T >
void vectorreadingD2
( 
  vector< PT > & v,
  T const * abeg,
  T const * aend
)
{
  assert((aend-abeg)%2==0);

  uint n = (aend-abeg)/2;
  vector< PT > v2(n);
  for (uint i=0; i<n; ++i)
  {
    v2[i] = PT(*abeg,*(abeg+1));
    ++abeg; ++abeg; 
  }

  v = v2;
}


/** Read a 1D array into a vector with each element being 2D. */
template<class PT, class T >
void vectorreadingD2
(
  vector< PT > & v,
  T const * abeg,
  uintc N
)
{
  T const * aend = abeg + N*2;
  vectorreadingD2(v,abeg,aend);
}


template< typename PT >
class vectorreadingD2primitive
{
public:

  template< class VEC, class T, class INDX >
  void read
  (
    VEC & v,
    T const * abeg,
    T const * aend,
    INDX i0=0
  )
  {
    assert((aend-abeg)%2==0);
    T * i = abeg;
  
    for ( ; i != aend; ++i)
    {
      v[i0] = PT(*i,*(i+1));
      ++i; ++i;
    }
  }
};
  





/** Read a 1D array into a vector with each element being 3D. */
template<class PT, class T >
void vectorreadingD3
( 
  vector< PT > & v,
  T const * abeg,
  T const * aend
)
{
  assert((aend-abeg)%3==0);

  uint n = (aend-abeg)/3;
  vector< PT > v2(n);
  for (uint i=0; i<n; ++i)
  {
    v2[i] = PT(*abeg,*(abeg+1),*(abeg+2));
    ++abeg; ++abeg; ++abeg; 
  }

  v = v2;
}

/** Read a 1D array into a vector with each element being 3D. */
template<class PT, class T >
void vectorreadingD3
(
  vector< PT > & v,
  T const * abeg,
  uintc N
)
{
  T const * aend = abeg + N*3;
  vectorreadingD3(v,abeg,aend);
}




#endif



