/*
 *   Copyright 2003-2004 The Apache Software Foundation.
// (c) Copyright IBM Corp. 2004, 2005 All Rights Reserved
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 *
 */

#if !defined(_AXISUSERAPIARRAYS_H____OF_AXIS_INCLUDED_)
#define _AXISUSERAPIARRAYS_H____OF_AXIS_INCLUDED_

/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* ----------------------------------------------------------------   */
/* CHANGES TO hpp HEADER FILE MAY NEED TO BE PROPAGATED TO THE        */
/* C-EQUIVALENT HEADER FILE IN SUPPORT OF THE C-BINDING INTERFACES.   */
/* ----------------------------------------------------------------   */
/* NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE   */
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */

 /**
  * @file AxisUserAPIArrays.hpp
  * This file contains arrays defined for the basic types declared in AxisUserAPI.hpp
  * 
  * 
  * @author Adrian DIck (adrian.dick@uk.ibm.com)
  */

#include <time.h>
#include <string.h>

#include <axis/GDefine.hpp>
#include <axis/TypeMapping.hpp>
#include <axis/AxisUserAPI.hpp>


AXIS_CPP_NAMESPACE_START



/**
 * @class xsd__duration_Array
 * 
 * The storage class for arrays of xsd__duration
 * 
 */
class STORAGE_CLASS_INFO xsd__duration_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__duration_Array();

    /**
     * Copy constructor
     * @param original Axis_Array to copy.
     */
    xsd__duration_Array(const xsd__duration_Array & original);
    
    /**
     * Destructor
     */
    virtual ~xsd__duration_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd_duration data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__duration** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd_duration data.
     */
    const xsd__duration** get(int& size) const;
};

/**
 * @class xsd__dateTime_Array
 * 
 * The storage class for arrays of xsd__dateTime
 * 
 */
class STORAGE_CLASS_INFO xsd__dateTime_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__dateTime_Array();

    /**
     * Copy constructor
     * @param original Axis_Array to copy.
     */
    xsd__dateTime_Array(const xsd__dateTime_Array & original);
    
    /**
     * Destructor
     */
    virtual ~xsd__dateTime_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd_duration data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__dateTime** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd_duration data.
     */
    const xsd__dateTime** get(int& size) const;
};

/**
 * @class xsd__time_Array
 * 
 * The storage class for arrays of xsd__time
 * 
 */
class STORAGE_CLASS_INFO xsd__time_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__time_Array();

    /**
     * Copy constructor
     * @param original Axis_Array to copy.
     */
    xsd__time_Array(const xsd__time_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__time_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd_duration data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__time** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd_duration data.
     */
    const xsd__time** get(int& size) const;
};

/**
 * @class xsd__date_Array
 * 
 * The storage class for arrays of xsd__date
 * 
 */
class STORAGE_CLASS_INFO xsd__date_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__date_Array();

    /**
     * Copy constructor
     * @param original Axis_Array to copy.
     */
    xsd__date_Array(const xsd__date_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__date_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd_duration data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__date** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd_duration data.
     */
    const xsd__date** get(int& size) const;
};

/**
 * @class xsd__gYearMonth_Array
 * 
 * The storage class for arrays of xsd__gYearMonth
 * 
 */
class STORAGE_CLASS_INFO xsd__gYearMonth_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__gYearMonth_Array();

    /**
     * Copy constructor
     * @param original Axis_Array to copy.
     */
    xsd__gYearMonth_Array(const xsd__gYearMonth_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__gYearMonth_Array();
    
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd_duration data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__gYearMonth** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd_duration data.
     */
    const xsd__gYearMonth** get(int& size) const;
};

/**
 * @class xsd__gYear_Array
 * 
 * The storage class for arrays of xsd__gYear
 * 
 */
class STORAGE_CLASS_INFO xsd__gYear_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__gYear_Array();

    /**
     * Copy constructor
     * @param original Axis_Array to copy.
     */
    xsd__gYear_Array(const xsd__gYear_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__gYear_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd_duration data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__gYear** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd_duration data.
     */
    const xsd__gYear** get(int& size) const;
};

/**
 * @class xsd__gMonthDay_Array
 * 
 * The storage class for arrays of xsd__gMonthDay
 * 
 */
class STORAGE_CLASS_INFO xsd__gMonthDay_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__gMonthDay_Array();

    /**
     * Copy constructor
     * @param original Axis_Array to copy.
     */
    xsd__gMonthDay_Array(const xsd__gMonthDay_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__gMonthDay_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd_duration data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__gMonthDay** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd_duration data.
     */
    const xsd__gMonthDay** get(int& size) const;
};
/**
 * @class xsd__gDay_Array
 * 
 * The storage class for arrays of xsd__gDay
 * 
 */
class STORAGE_CLASS_INFO xsd__gDay_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__gDay_Array();

    /**
     * Copy constructor
     * @param original Axis_Array to copy.
     */
    xsd__gDay_Array(const xsd__gDay_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__gDay_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd_duration data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__gDay** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd_duration data.
     */
    const xsd__gDay** get(int& size) const;
};

/**
 * @class xsd__gMonth_Array
 * 
 * The storage class for arrays of xsd__gMonth
 * 
 */
class STORAGE_CLASS_INFO xsd__gMonth_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__gMonth_Array();

    /**
     * Copy constructor
     * @param original Axis_Array to copy.
     */
    xsd__gMonth_Array(const xsd__gMonth_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__gMonth_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd_duration data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__gMonth** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd_duration data.
     */
    const xsd__gMonth** get(int& size) const;
};

/**
 * @class xsd__string_Array
 * 
 * The storage class for arrays of xsd__string
 * 
 */
class STORAGE_CLASS_INFO xsd__string_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__string_Array();

    /**
     * Copy constructor
     * @param original xsd__string_Array to copy.
     */
    xsd__string_Array(const xsd__string_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__string_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__string data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__string* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__string data.
     */
    const xsd__string* get(int& size) const;
};

/**
 * @class xsd__normalizedString_Array
 * 
 * The storage class for arrays of xsd__normalizedString
 * 
 */
class STORAGE_CLASS_INFO xsd__normalizedString_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__normalizedString_Array();

    /**
     * Copy constructor
     * @param original xsd__normalizedString_Array to copy.
     */
    xsd__normalizedString_Array(const xsd__normalizedString_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__normalizedString_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__normalizedString data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__normalizedString* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__normalizedString data.
     */
    const xsd__normalizedString* get(int& size) const;
};

/**
 * @class xsd__token_Array
 * 
 * The storage class for arrays of xsd__token
 * 
 */
class STORAGE_CLASS_INFO xsd__token_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__token_Array();

    /**
     * Copy constructor
     * @param original xsd__token_Array to copy.
     */
    xsd__token_Array(const xsd__token_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__token_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__token data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__token* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__token data.
     */
    const xsd__token* get(int& size) const;
};

/**
 * @class xsd__language_Array
 * 
 * The storage class for arrays of xsd__language
 * 
 */
class STORAGE_CLASS_INFO xsd__language_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__language_Array();

    /**
     * Copy constructor
     * @param original xsd__language_Array to copy.
     */
    xsd__language_Array(const xsd__language_Array & original);
    
        
    /**
     * Destructor
     */
    virtual ~xsd__language_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__language data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__language* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__language data.
     */
    const xsd__language* get(int& size) const;
};

/**
 * @class xsd__Name_Array
 * 
 * The storage class for arrays of xsd__Name
 * 
 */
class STORAGE_CLASS_INFO xsd__Name_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__Name_Array();

    /**
     * Copy constructor
     * @param original xsd__Name_Array to copy.
     */
    xsd__Name_Array(const xsd__Name_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__Name_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__Name data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__Name* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__Name data.
     */
    const xsd__Name* get(int& size) const;
};

/**
 * @class xsd__NCName_Array
 * 
 * The storage class for arrays of xsd__NCName
 * 
 */
class STORAGE_CLASS_INFO xsd__NCName_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__NCName_Array();

    /**
     * Copy constructor
     * @param original xsd__NCName_Array to copy.
     */
    xsd__NCName_Array(const xsd__NCName_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__NCName_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__NCName data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__NCName* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__NCName data.
     */
    const xsd__NCName* get(int& size) const;
};

/**
 * @class xsd__ID_Array
 * 
 * The storage class for arrays of xsd__ID
 * 
 */
class STORAGE_CLASS_INFO xsd__ID_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__ID_Array();

    /**
     * Copy constructor
     * @param original xsd__ID_Array to copy.
     */
    xsd__ID_Array(const xsd__ID_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__ID_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__ID data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__ID* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__ID data.
     */
    const xsd__ID* get(int& size) const;
};

/**
 * @class xsd__IDREF_Array
 * 
 * The storage class for arrays of xsd__IDREF
 * 
 */
class STORAGE_CLASS_INFO xsd__IDREF_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__IDREF_Array();

    /**
     * Copy constructor
     * @param original xsd__IDREF_Array to copy.
     */
    xsd__IDREF_Array(const xsd__IDREF_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__IDREF_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__IDREF data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__IDREF* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__IDREF data.
     */
    const xsd__IDREF* get(int& size) const;
};

/**
 * @class xsd__IDREFS_Array
 * 
 * The storage class for arrays of xsd__IDREFS
 * 
 */
class STORAGE_CLASS_INFO xsd__IDREFS_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__IDREFS_Array();

    /**
     * Copy constructor
     * @param original xsd__IDREFS_Array to copy.
     */
    xsd__IDREFS_Array(const xsd__IDREFS_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__IDREFS_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__IDREFS data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__IDREFS* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__IDREFS data.
     */
    const xsd__IDREFS* get(int& size) const;
};

/**
 * @class xsd__ENTITY_Array
 * 
 * The storage class for arrays of xsd__ENTITY
 * 
 */
class STORAGE_CLASS_INFO xsd__ENTITY_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__ENTITY_Array();

    /**
     * Copy constructor
     * @param original xsd__ENTITY_Array to copy.
     */
    xsd__ENTITY_Array(const xsd__ENTITY_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__ENTITY_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__ENTITY data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__ENTITY* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__ENTITY data.
     */
    const xsd__ENTITY* get(int& size) const;
};

/**
 * @class xsd__ENTITIES_Array
 * 
 * The storage class for arrays of xsd__ENTITIES
 * 
 */
class STORAGE_CLASS_INFO xsd__ENTITIES_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__ENTITIES_Array();

    /**
     * Copy constructor
     * @param original xsd__ENTITIES_Array to copy.
     */
    xsd__ENTITIES_Array(const xsd__ENTITIES_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__ENTITIES_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__ENTITIES data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__ENTITIES* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__ENTITIES data.
     */
    const xsd__ENTITIES* get(int& size) const;
};

/**
 * @class xsd__NMTOKEN_Array
 * 
 * The storage class for arrays of xsd__NMTOKEN
 * 
 */
class STORAGE_CLASS_INFO xsd__NMTOKEN_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__NMTOKEN_Array();

    /**
     * Copy constructor
     * @param original xsd__NMTOKEN_Array to copy.
     */
    xsd__NMTOKEN_Array(const xsd__NMTOKEN_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__NMTOKEN_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__NMTOKEN data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__NMTOKEN* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__NMTOKEN data.
     */
    const xsd__NMTOKEN* get(int& size) const;
};

/**
 * @class xsd__NMTOKENS_Array
 * 
 * The storage class for arrays of xsd__NMTOKENS
 * 
 */
class STORAGE_CLASS_INFO xsd__NMTOKENS_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__NMTOKENS_Array();

    /**
     * Copy constructor
     * @param original xsd__NMTOKENS_Array to copy.
     */
    xsd__NMTOKENS_Array(const xsd__NMTOKENS_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__NMTOKENS_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__NMTOKENS data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__NMTOKENS* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__NMTOKENS data.
     */
    const xsd__NMTOKENS* get(int& size) const;
};

/**
 * @class xsd__string_Array
 * 
 * The storage class for arrays of xsd__string
 * 
 */
class STORAGE_CLASS_INFO xsd__anyType_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__anyType_Array();

    /**
     * Copy constructor
     * @param original xsd__anyType_Array to copy.
     */
    xsd__anyType_Array(const xsd__anyType_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__anyType_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__anyType data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__anyType* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__anyType data.
     */
    const xsd__anyType* get(int& size) const;
};

/**
 * @class xsd__boolean_Array
 * 
 * The storage class for arrays of xsd__boolean
 * 
 */
class STORAGE_CLASS_INFO xsd__boolean_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__boolean_Array();

    /**
     * Copy constructor
     * @param original xsd__boolean_Array to copy.
     */
    xsd__boolean_Array(const xsd__boolean_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__boolean_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__boolean data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__boolean** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__boolean data.
     */
    const xsd__boolean** get(int& size) const;
};

/**
 * @class xsd__base64Binary_Array
 * 
 * The storage class for arrays of xsd__base64Binary
 * 
 */
class STORAGE_CLASS_INFO xsd__base64Binary_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__base64Binary_Array();

    /**
     * Copy constructor
     * @param original xsd__base64Binary_Array to copy.
     */
    xsd__base64Binary_Array(const xsd__base64Binary_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__base64Binary_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__base64Binary data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__base64Binary** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__base64Binary data.
     */
    const xsd__base64Binary** get(int& size) const;
};

/**
 * @class xsd__hexBinary_Array
 * 
 * The storage class for arrays of xsd__hexBinary
 * 
 */
class STORAGE_CLASS_INFO xsd__hexBinary_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__hexBinary_Array();

    /**
     * Copy constructor
     * @param original xsd__hexBinary_Array to copy.
     */
    xsd__hexBinary_Array(const xsd__hexBinary_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__hexBinary_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__hexBinary data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__hexBinary** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__hexBinary data.
     */
    const xsd__hexBinary** get(int& size) const;
};

/**
 * @class xsd__float_Array
 * 
 * The storage class for arrays of xsd__float
 * 
 */
class STORAGE_CLASS_INFO xsd__float_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__float_Array();

    /**
     * Copy constructor
     * @param original xsd__float_Array to copy.
     */
    xsd__float_Array(const xsd__float_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__float_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__float data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__float** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__float data.
     */
    const xsd__float** get(int& size) const;
};

/**
 * @class xsd__decimal_Array
 * 
 * The storage class for arrays of xsd__decimal
 * 
 */
class STORAGE_CLASS_INFO xsd__decimal_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__decimal_Array();

    /**
     * Copy constructor
     * @param original xsd__decimal_Array to copy.
     */
    xsd__decimal_Array(const xsd__decimal_Array & original);
    
    /**
     * Destructor
     */
    virtual ~xsd__decimal_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__decimal data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__decimal** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__decimal data.
     */
    const xsd__decimal** get(int& size) const;
};

/**
 * @class xsd__integer_Array
 * 
 * The storage class for arrays of xsd__integer
 * 
 */
class STORAGE_CLASS_INFO xsd__integer_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__integer_Array();

    /**
     * Copy constructor
     * @param original xsd__integer_Array to copy.
     */
    xsd__integer_Array(const xsd__integer_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__integer_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__integer data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__integer** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__integer data.
     */
    const xsd__integer** get(int& size) const;
};

/**
 * @class xsd__nonPositiveInteger_Array
 * 
 * The storage class for arrays of xsd__nonPositiveInteger
 * 
 */
class STORAGE_CLASS_INFO xsd__nonPositiveInteger_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__nonPositiveInteger_Array();

    /**
     * Copy constructor
     * @param original xsd__nonPositiveInteger_Array to copy.
     */
    xsd__nonPositiveInteger_Array(const xsd__nonPositiveInteger_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__nonPositiveInteger_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__nonPositiveInteger data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__nonPositiveInteger** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__nonPositiveInteger data.
     */
    const xsd__nonPositiveInteger** get(int& size) const;
};

/**
 * @class xsd__negativeInteger_Array
 * 
 * The storage class for arrays of xsd__negativeInteger
 * 
 */
class STORAGE_CLASS_INFO xsd__negativeInteger_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__negativeInteger_Array();

    /**
     * Copy constructor
     * @param original xsd__negativeInteger_Array to copy.
     */
    xsd__negativeInteger_Array(const xsd__negativeInteger_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__negativeInteger_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__negativeInteger data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__negativeInteger** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__negativeInteger data.
     */
    const xsd__negativeInteger** get(int& size) const;
};

/**
 * @class xsd__long_Array
 * 
 * The storage class for arrays of xsd__long
 * 
 */
class STORAGE_CLASS_INFO xsd__long_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__long_Array();

    /**
     * Copy constructor
     * @param original xsd__long_Array to copy.
     */
    xsd__long_Array(const xsd__long_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__long_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__long data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__long** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__long data.
     */
    const xsd__long** get(int& size) const;
};

/**
 * @class xsd__int_Array
 * 
 * The storage class for arrays of xsd__int
 * 
 */
class STORAGE_CLASS_INFO xsd__int_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__int_Array();

    /**
     * Copy constructor
     * @param original xsd__int_Array to copy.
     */
    xsd__int_Array(const xsd__int_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__int_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__int data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__int** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__int data.
     */
    const xsd__int** get(int& size) const;
};

/**
 * @class xsd__short_Array
 * 
 * The storage class for arrays of xsd__short
 * 
 */
class STORAGE_CLASS_INFO xsd__short_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__short_Array();

    /**
     * Copy constructor
     * @param original xsd__short_Array to copy.
     */
    xsd__short_Array(const xsd__short_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__short_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__short data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__short** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__short data.
     */
    const xsd__short** get(int& size) const;
};

/**
 * @class xsd__byte_Array
 * 
 * The storage class for arrays of xsd__byte
 * 
 */
class STORAGE_CLASS_INFO xsd__byte_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__byte_Array();

    /**
     * Copy constructor
     * @param original xsd__byte_Array to copy.
     */
    xsd__byte_Array(const xsd__byte_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__byte_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__byte data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__byte** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__byte data.
     */
    const xsd__byte** get(int& size) const;
};

/**
 * @class xsd__nonNegativeInteger_Array
 * 
 * The storage class for arrays of xsd__nonNegativeInteger
 * 
 */
class STORAGE_CLASS_INFO xsd__nonNegativeInteger_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__nonNegativeInteger_Array();

    /**
     * Copy constructor
     * @param original xsd__nonNegativeInteger_Array to copy.
     */
    xsd__nonNegativeInteger_Array(const xsd__nonNegativeInteger_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__nonNegativeInteger_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__nonNegativeInteger data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__nonNegativeInteger** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__nonNegativeInteger data.
     */
    const xsd__nonNegativeInteger** get(int& size) const;
};

/**
 * @class xsd__unsignedLong_Array
 * 
 * The storage class for arrays of xsd__unsignedLong
 * 
 */
class STORAGE_CLASS_INFO xsd__unsignedLong_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__unsignedLong_Array();

    /**
     * Copy constructor
     * @param original xsd__unsignedLong_Array to copy.
     */
    xsd__unsignedLong_Array(const xsd__unsignedLong_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__unsignedLong_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__unsignedLong data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__unsignedLong** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__unsignedLong data.
     */
    const xsd__unsignedLong** get(int& size) const;
};

/**
 * @class xsd__unsignedInt_Array
 * 
 * The storage class for arrays of xsd__unsignedInt
 * 
 */
class STORAGE_CLASS_INFO xsd__unsignedInt_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__unsignedInt_Array();

    /**
     * Copy constructor
     * @param original xsd__unsignedInt_Array to copy.
     */
    xsd__unsignedInt_Array(const xsd__unsignedInt_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__unsignedInt_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__unsignedInt data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__unsignedInt** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__unsignedInt data.
     */
    const xsd__unsignedInt** get(int& size) const;
};

/**
 * @class xsd__unsignedByte_Array
 * 
 * The storage class for arrays of xsd__unsignedByte
 * 
 */
class STORAGE_CLASS_INFO xsd__unsignedByte_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__unsignedByte_Array();

    /**
     * Copy constructor
     * @param original xsd__unsignedByte_Array to copy.
     */
    xsd__unsignedByte_Array(const xsd__unsignedByte_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__unsignedByte_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__unsignedByte data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__unsignedByte** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__unsignedByte data.
     */
    const xsd__unsignedByte** get(int& size) const;
};

/**
 * @class xsd__unsignedShort_Array
 * 
 * The storage class for arrays of xsd__unsignedShort
 * 
 */
class STORAGE_CLASS_INFO xsd__unsignedShort_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__unsignedShort_Array();

    /**
     * Copy constructor
     * @param original xsd__unsignedShort_Array to copy.
     */
    xsd__unsignedShort_Array(const xsd__unsignedShort_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__unsignedShort_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__unsignedShort data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__unsignedShort** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__unsignedShort data.
     */
    const xsd__unsignedShort** get(int& size) const;
};

/**
 * @class xsd__positiveInteger_Array
 * 
 * The storage class for arrays of xsd__positiveInteger
 * 
 */
class STORAGE_CLASS_INFO xsd__positiveInteger_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__positiveInteger_Array();

    /**
     * Copy constructor
     * @param original xsd__positiveInteger_Array to copy.
     */
    xsd__positiveInteger_Array(const xsd__positiveInteger_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__positiveInteger_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__positiveInteger data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__positiveInteger** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__positiveInteger data.
     */
    const xsd__positiveInteger** get(int& size) const;
};

/**
 * @class xsd__double_Array
 * 
 * The storage class for arrays of xsd__double
 * 
 */
class STORAGE_CLASS_INFO xsd__double_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__double_Array();

    /**
     * Copy constructor
     * @param original xsd__double_Array to copy.
     */
    xsd__double_Array(const xsd__double_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__double_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__double data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__double** array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__double data.
     */
    const xsd__double** get(int& size) const;
};

/**
 * @class xsd__anyURI_Array
 * 
 * The storage class for arrays of xsd__anyURI
 * 
 */
class STORAGE_CLASS_INFO xsd__anyURI_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__anyURI_Array();

    /**
     * Copy constructor
     * @param original xsd__anyURI_Array to copy.
     */
    xsd__anyURI_Array(const xsd__anyURI_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__anyURI_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__anyURI data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__anyURI* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__anyURI data.
     */
    const xsd__anyURI* get(int& size) const;
};

/**
 * @class xsd__QName_Array
 * 
 * The storage class for arrays of xsd__QName
 * 
 */
class STORAGE_CLASS_INFO xsd__QName_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__QName_Array();

    /**
     * Copy constructor
     * @param original xsd__QName_Array to copy.
     */
    xsd__QName_Array(const xsd__QName_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__QName_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__QName data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__QName* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__QName data.
     */
    const xsd__QName* get(int& size) const;
};

/**
 * @class xsd__NOTATION_Array
 * 
 * The storage class for arrays of xsd__NOTATION
 * 
 */
class STORAGE_CLASS_INFO xsd__NOTATION_Array : public Axis_Array {
  public:
    /**
     * Constructor
     */
    xsd__NOTATION_Array();

    /**
     * Copy constructor
     * @param original xsd__NOTATION_Array to copy.
     */
    xsd__NOTATION_Array(const xsd__NOTATION_Array & original);
        
    /**
     * Destructor
     */
    virtual ~xsd__NOTATION_Array();
    
    /**
     * Populate the array from a c-style array
     * 
     * @param array is a c-style array of pointers to the xsd__NOTATION data.
     * @param size of the array, including NULL entries.
     */
     void set(xsd__NOTATION* array, int size);

    /**
     * Return a c-style array.
     * 
     * @param size will be updated with the size of the array returned.
     * @return c-style array of pointers to the xsd__NOTATION data.
     */
    const xsd__NOTATION* get(int& size) const;
};

AXIS_CPP_NAMESPACE_END
#endif

