/* $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_structval.h -- defines the etch_structvalue object.
 * etch_structvalue is a typed map of key/value pairs, where type is an etch_type,
 * a key is an etch_field, and value is an etch object. all values are the same 
 * class, corresponding to the struct type.
 */

#ifndef ETCHSTRUCTVAL_H
#define ETCHSTRUCTVAL_H

#include "etchmsgutl.h"
#include "etch_tagdata_inp.h"
#include "etch_tagdata_out.h"
#include "etchhash.h"


/**
 * etch_structvalue
 */
typedef struct etch_structvalue
{
    unsigned int    hashkey;    
    unsigned short  obj_type;  
    unsigned short  class_id;   
    struct objmask* 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_hashtable* items;       /* owned */
    etch_type*      struct_type; /* not owned */

} etch_structvalue;


etch_structvalue* new_structvalue(etch_type*, const int initialsize);
int destroy_structvalue (etch_structvalue*);
int structvalue_put     (etch_structvalue*, etch_field* key, objmask* value);
int structvalue_is_type (etch_structvalue*, etch_type*);
objmask* structvalue_get(etch_structvalue*, etch_field* key);
objmask* structvalue_remove(etch_structvalue*, etch_field* key); 
etch_hashtable* new_structvalue_hashtable();
int structvalue_count(etch_structvalue*);


#endif /* #ifndef ETCHSTRUCTVAL_H */ 