    /**************************************************************************\

    MODULE: GF2XVec

    SUMMARY:

    The class GF2XVec implements vectors of fixed-length GF2X's.  You can
    allocate a vector of GF2X's of a specified length, where the maximum
    size of each GF2X is also specified.  These parameters can be specified
    either with a constructor, or with SetSize.  It is an error to
    try to re-size a vector of non-xero , or store a GF2X that doesn't fit.
    The space can be released with "kill", and then you are free to call SetSize
    again.  If you want more flexible---but less efficient---vectors, use
    vec_GF2X.

    \**************************************************************************/

    #include <NTL/GF2X.h>

    class GF2XVec {
    public:
       GF2XVec();

       GF2XVec& operator=(const GF2XVec&);
       // first kill()'s destination (unless source and destination are
       // identical)

       GF2XVec(const GF2XVec&);

       ~GF2XVec();

       GF2XVec(GF2XVec&& other) noexcept;
       GF2XVec& operator=(GF2XVec&& other) noexcept;

       GF2XVec(long n, long d);
       // sets length to n and max size of each element to d,
       // where the size d measures the number of words

       void SetSize(long n, long d);
       // sets length to n and max size of each element to d,
       // where the size d measures the number of words

       long length() const;
       // length of vector

       long BaseSize() const;
       // max size of each element

       void kill();
       // release space

       GF2X* elts();
       const GF2X* elts() const;
       // pointer to first element

       GF2X& operator[](long i);
       const GF2X& operator[](long i) const;
       // indexing operator; starts at 0; no range checking

       swap(GF2XVec& x);
       // swap with x by swapping pointers

       void move(GF2XVec& other);
       // quick move other to *this
    };

    void swap(GF2XVec& x, GF2XVec& y);
    // swaps x and y by swapping pointers