Blame Vector.h

Packit a4aae4
Packit a4aae4
// -*- mode: c++; c-basic-offset:4 -*-
Packit a4aae4
Packit a4aae4
// This file is part of libdap, A C++ implementation of the OPeNDAP Data
Packit a4aae4
// Access Protocol.
Packit a4aae4
Packit a4aae4
// Copyright (c) 2002,2003 OPeNDAP, Inc.
Packit a4aae4
// Author: James Gallagher <jgallagher@opendap.org>
Packit a4aae4
//
Packit a4aae4
// This library is free software; you can redistribute it and/or
Packit a4aae4
// modify it under the terms of the GNU Lesser General Public
Packit a4aae4
// License as published by the Free Software Foundation; either
Packit a4aae4
// version 2.1 of the License, or (at your option) any later version.
Packit a4aae4
//
Packit a4aae4
// This library is distributed in the hope that it will be useful,
Packit a4aae4
// but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a4aae4
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a4aae4
// Lesser General Public License for more details.
Packit a4aae4
//
Packit a4aae4
// You should have received a copy of the GNU Lesser General Public
Packit a4aae4
// License along with this library; if not, write to the Free Software
Packit a4aae4
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
Packit a4aae4
//
Packit a4aae4
// You can contact OPeNDAP, Inc. at PO Box 112, Saunderstown, RI. 02874-0112.
Packit a4aae4
Packit a4aae4
// (c) COPYRIGHT URI/MIT 1995-1999
Packit a4aae4
// Please read the full copyright statement in the file COPYRIGHT_URI.
Packit a4aae4
//
Packit a4aae4
// Authors:
Packit a4aae4
//      jhrg,jimg       James Gallagher <jgallagher@gso.uri.edu>
Packit a4aae4
Packit a4aae4
// This is the interface definition file for the abstract class
Packit a4aae4
// Vector. Vector is the parent class for List and Array.
Packit a4aae4
Packit a4aae4
#ifndef _vector_h
Packit a4aae4
#define _vector_h 1
Packit a4aae4
Packit a4aae4
#ifndef _basetype_h
Packit a4aae4
#include "BaseType.h"
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifndef _dds_h
Packit a4aae4
#include "DDS.h"
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
#ifndef constraint_evaluator_h
Packit a4aae4
#include "ConstraintEvaluator.h"
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
class Crc32;
Packit a4aae4
Packit a4aae4
namespace libdap
Packit a4aae4
{
Packit a4aae4
Packit a4aae4
/** Holds a one-dimensional array of DAP2 data types.  This class
Packit a4aae4
    takes two forms, depending on whether the elements of the vector
Packit a4aae4
    are themselves simple or compound objects. This class contains
Packit a4aae4
    common functionality for the List and Array classes, and should
Packit a4aae4
    rarely be used directly.
Packit a4aae4
Packit a4aae4
    When each element of the class is a simple data type, the Vector
Packit a4aae4
    is implemented as a simple array of C types, rather than as an
Packit a4aae4
    array of BaseType data types.  A single private ``template''
Packit a4aae4
    BaseType instance (<tt>_var</tt>) is used to hold information in common
Packit a4aae4
    to all the members of the array.  The template is also used as a
Packit a4aae4
    container to pass values back and forth to an application
Packit a4aae4
    program, as in <tt>var()</tt>.
Packit a4aae4
Packit a4aae4
    If the elements of the vector are themselves compound data
Packit a4aae4
    types, the array is stored as a vector of BaseType pointers (see
Packit a4aae4
    the libdap class BaseTypePtrVec). The template is still used to
Packit a4aae4
    hold information in common to all the members of the array, but
Packit a4aae4
    is not used to pass information to and from the application
Packit a4aae4
    program.
Packit a4aae4
Packit a4aae4
    @brief Holds a one-dimensional collection of DAP2 data types.
Packit a4aae4
    @see BaseType
Packit a4aae4
    @see Array
Packit a4aae4
*/
Packit a4aae4
class Vector: public BaseType
Packit a4aae4
{
Packit a4aae4
private:
Packit a4aae4
    int d_length;  		// number of elements in the vector
Packit a4aae4
    BaseType *d_proto;  // element prototype for the Vector
Packit a4aae4
Packit a4aae4
    // _buf was a pointer to void; delete[] complained. 6/4/2001 jhrg
Packit a4aae4
    char *d_buf;   		// storage for cardinal data
Packit a4aae4
    vector<string> d_str;		// special storage for strings. jhrg 2/11/05
Packit a4aae4
    vector<BaseType *> d_compound_buf; 	// storage for data in compound types (e.g., Structure)
Packit a4aae4
Packit a4aae4
    // the number of elements we have allocated memory to store.
Packit a4aae4
    // This should be either the sizeof(buf)/width(bool constrained = false) for cardinal data
Packit a4aae4
    // or the capacity of d_str for strings or capacity of _vec.
Packit a4aae4
    unsigned int d_capacity;
Packit a4aae4
Packit a4aae4
    friend class MarshallerTest;
Packit a4aae4
Packit a4aae4
    /*
Packit a4aae4
     * Made these template methods private because they can't be
Packit a4aae4
     * overridden anyways (because c++...) - ndp 08/14/2015
Packit a4aae4
     *
Packit a4aae4
     */
Packit a4aae4
Packit a4aae4
    template <typename T> void value_worker(T *v) const;
Packit a4aae4
    template <typename T> void value_worker(vector<unsigned int> *indices, T *b) const;
Packit a4aae4
Packit a4aae4
    template <typename T> bool set_value_worker(T *v, int sz);
Packit a4aae4
    template <typename T> bool set_value_worker(vector<T> &v, int sz);
Packit a4aae4
Packit a4aae4
protected:
Packit a4aae4
    // This function copies the private members of Vector.
Packit a4aae4
    void m_duplicate(const Vector &v);
Packit a4aae4
Packit a4aae4
    bool m_is_cardinal_type() const;
Packit a4aae4
    unsigned int m_create_cardinal_data_buffer_for_type(unsigned int numEltsOfType);
Packit a4aae4
    void m_delete_cardinal_data_buffer();
Packit a4aae4
Packit a4aae4
    template <class CardType> void m_set_cardinal_values_internal(const CardType* fromArray, int numElts);
Packit a4aae4
Packit a4aae4
public:
Packit a4aae4
    Vector(const string &n, BaseType *v, const Type &t, bool is_dap4 = false);
Packit a4aae4
    Vector(const string &n, const string &d, BaseType *v, const Type &t, bool is_dap4 = false);
Packit a4aae4
    Vector(const Vector &rhs;;
Packit a4aae4
Packit a4aae4
    virtual ~Vector();
Packit a4aae4
Packit a4aae4
    Vector &operator=(const Vector &rhs;;
Packit a4aae4
    virtual BaseType *ptr_duplicate() = 0;
Packit a4aae4
Packit a4aae4
    /**
Packit a4aae4
     * Provide access to internal data by reference. Callers cannot delete this
Packit a4aae4
     * but can pass them to other methods.
Packit a4aae4
     *
Packit a4aae4
     * @note Added so that the NCML handler can code some optimizations in its
Packit a4aae4
     * specialized versions of Array. jhrg 8/14/15
Packit a4aae4
     * @return A pointer to the data buffer for Vectors/Arrays of the cardinal types.
Packit a4aae4
     */
Packit a4aae4
    char *get_buf() {
Packit a4aae4
        return d_buf;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    /**
Packit a4aae4
     * Provide access to internal string data by reference. Callers cannot delete this
Packit a4aae4
     * but can pass them to other methods.
Packit a4aae4
     *
Packit a4aae4
     * @return A reference to a vector of strings
Packit a4aae4
     */
Packit a4aae4
    vector<string> &get_str() {
Packit a4aae4
        return d_str;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
    /**
Packit a4aae4
     * Provide access to internal data by reference. Callers cannot delete this
Packit a4aae4
     * but can pass them to other methods.
Packit a4aae4
     *
Packit a4aae4
     * @return A reference to a vector of BaseType pointers. Treat with care; never
Packit a4aae4
     * delete these!
Packit a4aae4
     */
Packit a4aae4
    vector<BaseType*> &get_compound_buf() {
Packit a4aae4
        return d_compound_buf;
Packit a4aae4
    }
Packit a4aae4
Packit a4aae4
#if 0
Packit a4aae4
    virtual bool is_dap2_only_type();
Packit a4aae4
#endif
Packit a4aae4
Packit a4aae4
    virtual BaseType *prototype() const { return d_proto; }
Packit a4aae4
Packit a4aae4
    virtual void set_name(const std::string& name);
Packit a4aae4
Packit a4aae4
    virtual int element_count(bool leaves);
Packit a4aae4
Packit a4aae4
    virtual void set_send_p(bool state);
Packit a4aae4
Packit a4aae4
    virtual void set_read_p(bool state);
Packit a4aae4
Packit a4aae4
    virtual unsigned int width(bool constrained = false) const;
Packit a4aae4
Packit a4aae4
    virtual int length() const;
Packit a4aae4
Packit a4aae4
    virtual void set_length(int l);
Packit a4aae4
Packit a4aae4
    // DAP2
Packit a4aae4
    virtual void intern_data(ConstraintEvaluator &eval, DDS &dds;;
Packit a4aae4
    virtual bool serialize(ConstraintEvaluator &eval, DDS &dds, Marshaller &m, bool ce_eval = true);
Packit a4aae4
#if 0
Packit a4aae4
    virtual bool serialize_no_release(ConstraintEvaluator &eval, DDS &dds, Marshaller &m, bool ce_eval = true);
Packit a4aae4
#endif
Packit a4aae4
    virtual bool deserialize(UnMarshaller &um, DDS *dds, bool reuse = false);
Packit a4aae4
Packit a4aae4
    // DAP4
Packit a4aae4
    virtual void compute_checksum(Crc32 &checksum);
Packit a4aae4
    virtual void intern_data(/*Crc32 &checksum*/);
Packit a4aae4
    virtual void serialize(D4StreamMarshaller &m, DMR &dmr, bool filter = false);
Packit a4aae4
#if 0
Packit a4aae4
    virtual void serialize_no_release(D4StreamMarshaller &m, DMR &dmr, bool filter = false);
Packit a4aae4
#endif
Packit a4aae4
    virtual void deserialize(D4StreamUnMarshaller &um, DMR &dmr);
Packit a4aae4
Packit a4aae4
    virtual unsigned int val2buf(void *val, bool reuse = false);
Packit a4aae4
    virtual unsigned int buf2val(void **val);
Packit a4aae4
Packit a4aae4
    void set_vec(unsigned int i, BaseType *val);
Packit a4aae4
    void set_vec_nocopy(unsigned int i, BaseType * val);
Packit a4aae4
Packit a4aae4
    void vec_resize(int l);
Packit a4aae4
Packit a4aae4
    virtual void clear_local_data();
Packit a4aae4
Packit a4aae4
    virtual unsigned int get_value_capacity() const;
Packit a4aae4
    virtual void reserve_value_capacity(unsigned int numElements);
Packit a4aae4
    virtual void reserve_value_capacity();
Packit a4aae4
Packit a4aae4
    virtual unsigned int set_value_slice_from_row_major_vector(const Vector& rowMajorData, unsigned int startElement);
Packit a4aae4
Packit a4aae4
Packit a4aae4
    virtual bool set_value(dods_byte *val, int sz);
Packit a4aae4
    virtual bool set_value(dods_int8 *val, int sz);
Packit a4aae4
    virtual bool set_value(dods_int16 *val, int sz);
Packit a4aae4
    virtual bool set_value(dods_uint16 *val, int sz);
Packit a4aae4
    virtual bool set_value(dods_int32 *val, int sz);
Packit a4aae4
    virtual bool set_value(dods_uint32 *val, int sz);
Packit a4aae4
    virtual bool set_value(dods_int64 *val, int sz);
Packit a4aae4
    virtual bool set_value(dods_uint64 *val, int sz);
Packit a4aae4
    virtual bool set_value(dods_float32 *val, int sz);
Packit a4aae4
    virtual bool set_value(dods_float64 *val, int sz);
Packit a4aae4
    virtual bool set_value(string *val, int sz);
Packit a4aae4
Packit a4aae4
Packit a4aae4
    virtual bool set_value(vector<dods_byte> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<dods_int8> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<dods_int16> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<dods_uint16> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<dods_int32> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<dods_uint32> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<dods_int64> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<dods_uint64> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<dods_float32> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<dods_float64> &val, int sz);
Packit a4aae4
    virtual bool set_value(vector<string> &val, int sz);
Packit a4aae4
Packit a4aae4
    virtual void value(dods_byte *b) const;
Packit a4aae4
    virtual void value(dods_int8 *b) const;
Packit a4aae4
    virtual void value(dods_int16 *b) const;
Packit a4aae4
    virtual void value(dods_uint16 *b) const;
Packit a4aae4
    virtual void value(dods_int32 *b) const;
Packit a4aae4
    virtual void value(dods_uint32 *b) const;
Packit a4aae4
    virtual void value(dods_int64 *b) const;
Packit a4aae4
    virtual void value(dods_uint64 *b) const;
Packit a4aae4
    virtual void value(dods_float32 *b) const;
Packit a4aae4
    virtual void value(dods_float64 *b) const;
Packit a4aae4
    virtual void value(vector<string> &b) const;
Packit a4aae4
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_byte *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_int8 *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_int16 *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_uint16 *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_int32 *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_uint32 *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_int64 *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_uint64 *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_float32 *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *indices, dods_float64 *b) const;
Packit a4aae4
    virtual void value(vector<unsigned int> *index, vector<string> &b) const;
Packit a4aae4
Packit a4aae4
    virtual void *value();
Packit a4aae4
Packit a4aae4
    virtual BaseType *var(const string &name = "", bool exact_match = true, btp_stack *s = 0);
Packit a4aae4
    virtual BaseType *var(const string &name, btp_stack &s);
Packit a4aae4
    virtual BaseType *var(unsigned int i);
Packit a4aae4
Packit a4aae4
    virtual void add_var(BaseType *v, Part p = nil);
Packit a4aae4
    virtual void add_var_nocopy(BaseType *v, Part p = nil);
Packit a4aae4
Packit a4aae4
    virtual bool check_semantics(string &msg, bool all = false);
Packit a4aae4
Packit a4aae4
    virtual void dump(ostream &strm) const ;
Packit a4aae4
};
Packit a4aae4
Packit a4aae4
} // namespace libdap
Packit a4aae4
Packit a4aae4
#endif /* _vector_h */