TokenQueue (4384B)
1 /* -*- C++ -*- vim: set syntax=cpp: 2 * (C) 2004-2009 Frank-Rene Schaefer */ 3 #ifndef __QUEX_INCLUDE_GUARD__TOKEN__TOKEN_QUEUE 4 #define __QUEX_INCLUDE_GUARD__TOKEN__TOKEN_QUEUE 5 6 #include "definitions" 7 #include "asserts" 8 #include "MemoryManager" 9 10 #ifndef QUEX_TYPE_TOKEN 11 # error "QUEX_TYPE_TOKEN must be defined before including this file." 12 #endif 13 14 15 QUEX_NAMESPACE_MAIN_OPEN 16 17 typedef struct QUEX_SETTING_USER_CLASS_DECLARATION_EPILOG { 18 19 QUEX_TYPE_TOKEN* begin; 20 QUEX_TYPE_TOKEN* read_iterator; /* pointer to next token to be read */ 21 QUEX_TYPE_TOKEN* write_iterator; /* pointer to next token to be written */ 22 QUEX_TYPE_TOKEN* end_minus_safety_border; 23 QUEX_TYPE_TOKEN* end; 24 /* A token might be 'N' times repeated. This is the only case where a token 25 * queue overflow might occur. When the token queue is full and there are still 26 * 'N' tokens to be repeated, then the remaining 'N' are stored in the following 27 * variable. */ 28 29 } QUEX_NAME(TokenQueue); 30 31 QUEX_INLINE void QUEX_NAME(TokenQueue_reset)(QUEX_NAME(TokenQueue)* me); 32 QUEX_INLINE void QUEX_NAME(TokenQueue_init)(QUEX_NAME(TokenQueue)* me, 33 QUEX_TYPE_TOKEN* Memory, 34 QUEX_TYPE_TOKEN* MemoryEnd); 35 QUEX_INLINE void QUEX_NAME(TokenQueue_construct)(QUEX_NAME(TokenQueue)* me, 36 QUEX_TYPE_TOKEN* Memory, 37 const size_t N); 38 # if defined(QUEX_OPTION_USER_MANAGED_TOKEN_MEMORY) 39 QUEX_INLINE void QUEX_NAME(TokenQueue_disfunctionality_set)(QUEX_NAME(TokenQueue)* me); 40 QUEX_INLINE bool QUEX_NAME(TokenQueue_disfunctionality_check)(QUEX_NAME(TokenQueue)* me); 41 # endif 42 QUEX_INLINE void QUEX_NAME(TokenQueue_destruct)(QUEX_NAME(TokenQueue)* me); 43 QUEX_INLINE void QUEX_NAME(TokenQueue_remainder_get)(QUEX_NAME(TokenQueue)* me, 44 QUEX_TYPE_TOKEN** begin, 45 QUEX_TYPE_TOKEN** end); 46 QUEX_INLINE void QUEX_NAME(TokenQueue_memory_get)(QUEX_NAME(TokenQueue)* me, 47 QUEX_TYPE_TOKEN** memory, 48 size_t* n); 49 QUEX_INLINE bool QUEX_NAME(TokenQueue_is_full)(QUEX_NAME(TokenQueue)* me); 50 QUEX_INLINE bool QUEX_NAME(TokenQueue_is_empty)(QUEX_NAME(TokenQueue)* me); 51 QUEX_INLINE QUEX_TYPE_TOKEN* QUEX_NAME(TokenQueue_access_write_p)(QUEX_NAME(TokenQueue)* me); 52 QUEX_INLINE QUEX_TYPE_TOKEN* QUEX_NAME(TokenQueue_pop)(QUEX_NAME(TokenQueue)* me); 53 QUEX_INLINE QUEX_TYPE_TOKEN* QUEX_NAME(TokenQueue_begin)(QUEX_NAME(TokenQueue)* me); 54 QUEX_INLINE QUEX_TYPE_TOKEN* QUEX_NAME(TokenQueue_back)(QUEX_NAME(TokenQueue)* me); 55 QUEX_INLINE size_t QUEX_NAME(TokenQueue_available_n)(QUEX_NAME(TokenQueue)* me); 56 57 58 # ifdef QUEX_OPTION_ASSERTS 59 QUEX_INLINE void 60 QUEX_ASSERT_TOKEN_QUEUE_AFTER_WRITE(QUEX_NAME(TokenQueue)* me); 61 62 QUEX_INLINE void 63 QUEX_TOKEN_QUEUE_ASSERT(QUEX_NAME(TokenQueue)* me); 64 # else 65 # define QUEX_TOKEN_QUEUE_ASSERT(me) /* empty */ 66 # define QUEX_ASSERT_TOKEN_QUEUE_AFTER_WRITE(me) /* empty */ 67 # endif 68 69 typedef struct QUEX_SETTING_USER_CLASS_DECLARATION_EPILOG { 70 QUEX_TYPE_TOKEN* token_list; 71 size_t size; 72 } QUEX_NAME(TokenQueueRemainder); 73 74 #if 1 75 QUEX_INLINE void QUEX_NAME(TokenQueueRemainder_save)(QUEX_NAME(TokenQueueRemainder)* me, 76 QUEX_NAME(TokenQueue)* token_queue); 77 78 QUEX_INLINE void QUEX_NAME(TokenQueueRemainder_restore)(QUEX_NAME(TokenQueueRemainder)* me, 79 QUEX_NAME(TokenQueue)* token_queue); 80 #endif 81 82 QUEX_NAMESPACE_MAIN_CLOSE 83 84 #endif /* __QUEX_INCLUDE_GUARD__TOKEN__TOKENQUEUE */