]> rtime.felk.cvut.cz Git - frescor/forb.git/commitdiff
Added helper macros for easier work with sequences
authorMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 12 May 2009 23:14:10 +0000 (01:14 +0200)
committerMichal Sojka <sojkam1@fel.cvut.cz>
Tue, 12 May 2009 23:15:19 +0000 (01:15 +0200)
src/basic_types.h

index 8c4930cdf6404b952e4d4ebf0398ef1b0a7415a8..ace5f03fa283d239d8eab5f110b283068daeda26 100644 (file)
@@ -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