/* $Id$ 
 * 
 * Licensed to the Apache Software Foundation (ASF) under one or more 
 * contributor license agreements. See the NOTICE file distributed with  
 * this work for additional information regarding copyright ownership. 
 * The ASF licenses this file to you 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. 
 */ 

/**
 * etch_arrayval.h 
 */

#ifndef ETCHARRAYVAL_H
#define ETCHARRAYVAL_H

#include "etchmsgutl.h"
#include "etch_arraylist.h"
#define ETCHARRAYVAL_READONLY TRUE
#define ETCHARRAYVAL_NOTREADONLY FALSE


/**
 * etch_arrayvalue
 * an array of values, where each value is a pointer to an etch object. 
 */
struct etch_arrayvalue
{
    unsigned int     hashkey;    
    unsigned short   obj_type;   
    unsigned short   class_id;   
    struct vtabmask* vtab;         
    int  (*destroy) (void*);     
    void*(*clone)   (void*); 
    obj_gethashkey   get_hashkey;    
    struct objmask*  parent;     
    etchresult*      result;     
    unsigned int     refcount;       
    unsigned int     length;     
    unsigned char    is_null;   
    unsigned char    is_copy;   
    unsigned char    is_static;  
    unsigned char    reserved;  
 
    etch_arraylist* list;
    unsigned short content_obj_type;  /* etch obj_type of a native value */
    unsigned short content_class_id;  /* etch class_id of a native value */
    int  dim;

    /* this object may be masked by etch_collection_mask to determine content
     * type and class, so do not add any fields above this comment */

    unsigned short content_item_size; /* byte count of a native value */ 
    unsigned char  is_array_owned;    /* arrayvalue owns natarray? */ 
    signed   char  type_code;         /* external content type */

    etch_type* custom_struct_type;    /* not owned */
    etch_nativearray* natarray;       /* see is_array_owned */
};

typedef struct etch_arrayvalue etch_arrayvalue;

/**
 * new_arrayvalue_arraylist()
 * allocates and returns an arraylist configured appropriately for use as arrayvalue backing store
 */
etch_arraylist* new_arrayvalue_arraylist(const int initsize, const int deltsize, 
    const int is_readonly, const int is_synchronized);

/* public methods on etch_arrayvalue */
etch_arrayvalue* new_arrayvalue(const byte type_code, etch_type* custom_struct_type, 
    const int dim, const int initsize, const int deltsize, 
    const int is_readonly, const int is_synchronized);

etch_arrayvalue* new_arrayvalue_from(etch_nativearray* natarray, 
    const signed char type_code, etch_type* custom_struct_type, 
    const int initsize, const int deltsize, 
    const int is_readonly);

etch_arrayvalue* new_arrayvalue_default();

int  destroy_arrayvalue(etch_arrayvalue* thisp);

ETCH_ARRAY_ELEMENT* new_array_element(const int objtype);

int   arrayvalue_add (etch_arrayvalue* thisp, ETCH_ARRAY_ELEMENT* content);

int   arrayvalue_count(etch_arrayvalue*);
void* arrayvalue_get(etch_arrayvalue*, const int index);

int   arrayvalue_set_iterator(etch_arrayvalue*, etch_iterator*);
void  arrayvalue_set_static_content(etch_arrayvalue*, const int is_set);

int   arrayvalue_to_nativearray(etch_arrayvalue*);

signed char arrayvalue_get_external_typecode (unsigned short, unsigned short);
signed char etch_classid_to_arraytype (const unsigned short class_id);
unsigned short etch_arraytype_to_classid (const signed char typecode);


#endif /* #ifndef ETCHARRAYVAL_H */