diff -r 6bcc0aa4be39 -r 889504eac4fb xmlsrv_plat/cxml_library_api/inc/nw_tinytree_ebuffer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/xmlsrv_plat/cxml_library_api/inc/nw_tinytree_ebuffer.h Tue Aug 31 17:02:56 2010 +0300 @@ -0,0 +1,170 @@ +/* +* Copyright (c) 2000 - 2001 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +/** ----------------------------------------------------------------------- ** + @package: NW_TinyTree + + @synopsis: default + + @description: default + + ** ----------------------------------------------------------------------- **/ + +#ifndef NW_TINYTREE_EBUFFER_H +#define NW_TINYTREE_EBUFFER_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* ----------------------------------------------------------------------- ** + EBuffers (expandable buffers) provide storage blocks of bytes that + can be accessed by index. Tiny trees use these to store serialized + tree data. Node source offsets are stored as ebuffer indexes. EBuffers + are similar to segmented vectors, but with variable segment sizes so + that continuous byte blocks of different sizes can be stored efficiently. + Unlike vectors, EBuffers store only byte data, so alignment calculations + are not needed. Also, EBuffers support appending, but not insertion and + deletion. These simplifications make it much easier to deal with + variable segment sizes while guaranteeing that continuous blocks remain + continuous. +** ----------------------------------------------------------------------- **/ + +/* ------------------------------------------------------------------------- */ + +#define NW_TINY_TREE_BLOCK_SIZE_DEFAULT ((CXML_Vector_Metric_t) 256) + + +/** ----------------------------------------------------------------------- ** + @struct: NW_TinyTree_Segment + + @synopsis: Tiny tree data segment. + + @scope: public + @variables: + NW_Uint8* storage + Data storage. + + CXML_Vector_Metric_t segmentSize + Size of segment. + + CXML_Vector_Metric_t freeOffset + Free offset. + + @description: Tiny tree data segment. + ** ----------------------------------------------------------------------- **/ +typedef struct NW_TinyTree_Segment_s { + NW_Uint8* storage; + NW_TinyTree_Offset_t segmentSize; + NW_TinyTree_Offset_t freeOffset; +} NW_TinyTree_Segment_t; + + +/** ----------------------------------------------------------------------- ** + @struct: NW_TinyTree_EBuffer + + @synopsis: Tiny tree E buffer. + + @scope: public + @variables: + NW_Bool ownFirstBlock + Ownership flag. + + CXML_Vector_Metric_t blockSize + Size of block, + + NW_TinyTree_Segment_t* segmentList + List of segments. + + CXML_Vector_Metric_t segmentListSize + Size of segment list. + + CXML_Vector_Metric_t numSegments + Number of segments. + + @description: EBuffers (expandable buffers) provide storage blocks + of bytes that can be accessed by index. Tiny trees use + these to store serialized tree data. Node source + offsets are stored as ebuffer indexes. EBuffers are + similar to segmented vectors, but with variable + segment sizes so that continuous byte blocks of + different sizes can be stored efficiently. Unlike + vectors, EBuffers store only byte data, so alignment + calculations are not needed. Also, EBuffers support + appending, but not insertion and deletion. These + simplifications make it much easier to deal with + variable segment sizes while guaranteeing that + continuous blocks remain continuous. + + ** ----------------------------------------------------------------------- **/ +typedef struct NW_TinyTree_EBuffer_s { + NW_Bool ownFirstBlock; + CXML_Vector_Metric_t blockSize; + NW_TinyTree_Segment_t* segmentList; + CXML_Vector_Metric_t segmentListSize; + CXML_Vector_Metric_t numSegments; +} NW_TinyTree_EBuffer_t; + +/* ------------------------------------------------------------------------- * + public methods + * ------------------------------------------------------------------------- */ + +NW_TinyTree_EBuffer_t* +NW_TinyTree_EBuffer_Construct (NW_Uint8* initialBuffer, + NW_TinyTree_Offset_t initBuffSize, + NW_TinyTree_Offset_t blockSize, + NW_Bool freeBuff); + +void +NW_TinyTree_EBuffer_Destruct (NW_TinyTree_EBuffer_t* thisObj); + +extern +NW_Uint8* +NW_TinyTree_EBuffer_GetWritableBlock(NW_TinyTree_EBuffer_t* ebuffer, + NW_TinyTree_Offset_t size, + NW_TinyTree_Offset_t* index); + + +extern +NW_Status_t +NW_TinyTree_EBuffer_GetSegmentAndOffset(NW_TinyTree_EBuffer_t* ebuffer, + NW_TinyTree_Offset_t index, + NW_Uint8** segment, /* OUT */ + NW_TinyTree_Offset_t* segSize, /* OUT */ + NW_TinyTree_Offset_t* offset); /* OUT */ + +extern +NW_Status_t +NW_TinyTree_EBuffer_GetIndex(NW_TinyTree_EBuffer_t* ebuffer, + NW_Uint8* segmentAddr, + NW_TinyTree_Offset_t offset, + NW_TinyTree_Offset_t * index); /* OUT */ + +extern +NW_Uint8* +NW_TinyTree_EBuffer_AddressAt(NW_TinyTree_EBuffer_t* ebuffer, + NW_TinyTree_Offset_t index); + + +#ifdef __cplusplus +} /* extern "C" { */ +#endif /* __cplusplus */ + +#endif /* NW_TINYTREE_EBUFFER_H */