xmlsrv_plat/cxml_library_api/inc/nw_tinytree_ebuffer.h
branchRCL_3
changeset 32 889504eac4fb
--- /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 <xml/cxml/cxml_proj.h>
+
+#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 */