blob: 1e9ccf45fc1c052900a5074fb2c3fc02adcf44b5 [file] [log] [blame]
/* $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.
*/
/*
* a flex_buffer wraps a byte array and manages the active region of
* it (0..length). it supports dynamically extending the buffer.
*
* a flexbuffer has an index (read or write cursor). the various get
* and put operations always occur at the current index, with the index
* adjusted appropriately afterward. get() will not move the index past
* length. if put needs to move index past length, length is also
* adjusted. this may cause the byte array to be re-allocated.
*/
#ifndef ETCH_FLEX_BUFFER_H
#define ETCH_FLEX_BUFFER_H
#include "etch_object.h"
#ifdef __cplusplus
extern "C" {
#endif
#define ETCH_FLEXBUF_PUT_ALL (-1)
typedef struct etch_flexbuffer
{
etch_object object;
unsigned char *buf;
size_t bufsize; /* buffer size */
size_t datalen; /* data length */
size_t index; /* current position */
unsigned char is_littleendian;
} etch_flexbuffer;
etch_flexbuffer *new_flexbuffer(size_t);
etch_flexbuffer *new_flexwriter_from (void *buf, size_t, size_t);
etch_flexbuffer *new_flexbuffer_from (void *buf, size_t, size_t, size_t);
etch_flexbuffer *etch_flexbuf_create_b (void *buf, size_t, size_t);
etch_flexbuffer *etch_flexbuf_create_bi(void *buf, size_t, size_t, size_t);
etch_flexbuffer *etch_flexbuf_skip (etch_flexbuffer*, size_t, int);
byte* etch_flexbuf_get_buffer(etch_flexbuffer*);
int destroy_etch_flexbuffer(void*);
int etch_flexbuf_set_length(etch_flexbuffer*, size_t);
int etch_flexbuf_set_index (etch_flexbuffer*, size_t);
void etch_flexbuf_clear (etch_flexbuffer*);
size_t etch_flexbuf_avail (etch_flexbuffer*);
int etch_flexbuffer_reset_to (etch_flexbuffer*, size_t);
etch_flexbuffer *etch_flexbuf_compact(etch_flexbuffer*);
etch_flexbuffer *etch_flexbuf_reset (etch_flexbuffer*);
size_t etch_flexbuf_get (etch_flexbuffer*, byte*, size_t, size_t);
int etch_flexbuf_get_byte (etch_flexbuffer*, byte* out);
int etch_flexbuf_get_short (etch_flexbuffer*, short* out);
int etch_flexbuf_get_int (etch_flexbuffer*, int* out);
int etch_flexbuf_get_long (etch_flexbuffer*, int64* out);
int etch_flexbuf_get_float (etch_flexbuffer*, float* out);
int etch_flexbuf_get_double(etch_flexbuffer*, double* out);
size_t etch_flexbuf_get_fully (etch_flexbuffer*, byte*, size_t);
byte* etch_flexbuf_get_all (etch_flexbuffer*, size_t* out_count);
byte* etch_flexbuf_get_allfrom(etch_flexbuffer*, size_t, size_t* out_count);
size_t etch_flexbuf_put (etch_flexbuffer*, byte*, size_t, size_t);
size_t etch_flexbuf_put_from (etch_flexbuffer*, etch_flexbuffer*, size_t);
size_t etch_flexbuf_put_byte (etch_flexbuffer*, byte value);
size_t etch_flexbuf_put_short (etch_flexbuffer*, short value);
size_t etch_flexbuf_put_int (etch_flexbuffer*, int value);
size_t etch_flexbuf_put_long (etch_flexbuffer*, int64 value);
size_t etch_flexbuf_put_float (etch_flexbuffer*, float value);
size_t etch_flexbuf_put_double (etch_flexbuffer*, double value);
#ifdef __cplusplus
}
#endif
#endif /* ETCH_FLEX_BUFFER_H */