From 5844ec2b303822f4dd6e211d5750a794c008b324 Mon Sep 17 00:00:00 2001 From: Michal Sojka Date: Wed, 13 May 2009 01:14:10 +0200 Subject: [PATCH] Added helper macros for easier work with sequences --- src/basic_types.h | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/src/basic_types.h b/src/basic_types.h index 8c4930c..ace5f03 100644 --- a/src/basic_types.h +++ b/src/basic_types.h @@ -88,4 +88,43 @@ typedef CORBA_wchar *CORBA_wstring; */ #define CORBA_sequence_set_release(seq, val) ((seq)->_release = (val)) +/** @name Sequence helper macros */ +/**@{*/ +#define forb_sequence_alloc_buf(seq, num_elements) do { \ + memset(&(seq), 0, sizeof(seq)); \ + (seq)._buffer = forb_malloc((num_elements)*sizeof(*(seq)._buffer)); \ + (seq)._maximum = (seq)._buffer ? (num_elements) : 0; \ + (seq)._length = 0; \ + } while(0) + +#define forb_sequence_alloc(seq_ptr, num_elements) do { \ + seq = forb_malloc(sizeof(*(seq_ptr))); \ + memset((seq_ptr), 0, sizeof(*(seq_ptr))); \ + forb_sequence_alloc_buf(*(seq_ptr)); \ + } while(0) + +static inline void forb_no_destructor(void *elem) { +#ifdef __cplusplus + (void*)elem; /* Suppress g++ warning */ +#endif +} + +#define forb_sequence_free_buf(seq, elem_destructor) do { \ + if (CORBA_sequence_get_release(&(seq))) { \ + int i; \ + for (i=0; i<(seq)._length; i++) { \ + elem_destructor(&(seq)._buffer[i]); \ + } \ + forb_free((seq)._buffer); \ + } \ + } while(0) + +#define forb_sequence_free(seq_ptr, elem_destructor) do { \ + forb_sequence_free_buf(*(seq_ptr), (elem_destructor)); \ + forb_free(seq_ptr); \ + } while(0) + +#define forb_sequence_elem(seq, index) ((seq)._buffer[index]) +/**@}*/ + #endif -- 2.39.2