|
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 */
|