Line data Source code
1 : #ifndef HEADER_fd_src_funk_fd_funk_private_h 2 : #define HEADER_fd_src_funk_fd_funk_private_h 3 : 4 : /* fd_funk_private.h contains internal APIs deemed unsafe for public 5 : consumption. */ 6 : 7 : #include "fd_funk.h" 8 : 9 : /* fd_funk_all_iter_t iterators over all funk record objects in all funk 10 : transactions. This API is not optimized for performance and has a 11 : high fixed cost (slow even for empty DBs). 12 : 13 : Assumes no concurrent write accesses to the entire funk instance 14 : during the lifetime of this iterator. 15 : 16 : Usage is: 17 : 18 : fd_funk_all_iter_t iter[1]; 19 : for( fd_funk_all_iter_new( funk, iter ); !fd_funk_all_iter_done( iter ); fd_funk_all_iter_next( iter ) ) { 20 : fd_funk_rec_t const * rec = fd_funk_all_iter_ele_const( iter ); 21 : ... 22 : } */ 23 : 24 : struct fd_funk_all_iter { 25 : fd_funk_rec_map_t rec_map; 26 : ulong chain_cnt; 27 : ulong chain_idx; 28 : fd_funk_rec_map_iter_t rec_map_iter; 29 : }; 30 : 31 : typedef struct fd_funk_all_iter fd_funk_all_iter_t; 32 : 33 : FD_PROTOTYPES_BEGIN 34 : 35 : FD_FN_UNUSED static void 36 13806915 : fd_funk_all_iter_skip_nulls( fd_funk_all_iter_t * iter ) { 37 13806915 : if( iter->chain_idx == iter->chain_cnt ) return; 38 2572090494 : while( fd_funk_rec_map_iter_done( iter->rec_map_iter ) ) { 39 2558361618 : if( ++(iter->chain_idx) == iter->chain_cnt ) break; 40 2558283579 : iter->rec_map_iter = fd_funk_rec_map_iter( &iter->rec_map, iter->chain_idx ); 41 2558283579 : } 42 13806915 : } 43 : 44 : FD_FN_UNUSED static void 45 : fd_funk_all_iter_new( fd_funk_t const * funk, 46 78039 : fd_funk_all_iter_t * iter ) { 47 78039 : iter->rec_map = *funk->rec_map; 48 78039 : iter->chain_cnt = fd_funk_rec_map_chain_cnt( &iter->rec_map ); 49 78039 : iter->chain_idx = 0; 50 78039 : iter->rec_map_iter = fd_funk_rec_map_iter( &iter->rec_map, 0 ); 51 78039 : fd_funk_all_iter_skip_nulls( iter ); 52 78039 : } 53 : 54 : static inline int 55 13806915 : fd_funk_all_iter_done( fd_funk_all_iter_t const * iter ) { 56 13806915 : return ( iter->chain_idx == iter->chain_cnt ); 57 13806915 : } 58 : 59 : FD_FN_UNUSED static void 60 13728876 : fd_funk_all_iter_next( fd_funk_all_iter_t * iter ) { 61 13728876 : iter->rec_map_iter = fd_funk_rec_map_iter_next( iter->rec_map_iter ); 62 13728876 : fd_funk_all_iter_skip_nulls( iter ); 63 13728876 : } 64 : 65 : static inline fd_funk_rec_t const * 66 13728876 : fd_funk_all_iter_ele_const( fd_funk_all_iter_t * iter ) { 67 13728876 : return fd_funk_rec_map_iter_ele_const( iter->rec_map_iter ); 68 13728876 : } 69 : 70 : static inline fd_funk_rec_t * 71 0 : fd_funk_all_iter_ele( fd_funk_all_iter_t * iter ) { 72 0 : return fd_funk_rec_map_iter_ele( iter->rec_map_iter ); 73 0 : } 74 : 75 : FD_PROTOTYPES_END 76 : 77 : /* fd_funk_txn_all_iter_t iterators over all funk transaction objects. 78 : 79 : Assumes no concurrent write accesses to the entire funk instance 80 : during the lifetime of this iterator. 81 : 82 : Usage is: 83 : 84 : fd_funk_txn_all_iter_t txn_iter[1]; 85 : for( fd_funk_txn_all_iter_new( funk, txn_iter ); !fd_funk_txn_all_iter_done( txn_iter ); fd_funk_txn_all_iter_next( txn_iter ) ) { 86 : fd_funk_txn_t const * txn = fd_funk_txn_all_iter_ele_const( txn_iter ); 87 : ... 88 : } 89 : 90 : FIXME depth-first search transaction tree instead */ 91 : 92 : struct fd_funk_txn_all_iter { 93 : fd_funk_txn_map_t txn_map; 94 : ulong chain_cnt; 95 : ulong chain_idx; 96 : fd_funk_txn_map_iter_t txn_map_iter; 97 : }; 98 : 99 : typedef struct fd_funk_txn_all_iter fd_funk_txn_all_iter_t; 100 : 101 : FD_PROTOTYPES_BEGIN 102 : 103 : FD_FN_UNUSED static void 104 1421907 : fd_funk_txn_all_iter_skip_nulls( fd_funk_txn_all_iter_t * iter ) { 105 1421907 : if( iter->chain_idx == iter->chain_cnt ) return; 106 7908948 : while( fd_funk_txn_map_iter_done( iter->txn_map_iter ) ) { 107 6565068 : if( ++(iter->chain_idx) == iter->chain_cnt ) break; 108 6487041 : iter->txn_map_iter = fd_funk_txn_map_iter( &iter->txn_map, iter->chain_idx ); 109 6487041 : } 110 1421907 : } 111 : 112 : FD_FN_UNUSED static void 113 : fd_funk_txn_all_iter_new( fd_funk_t const * funk, 114 78027 : fd_funk_txn_all_iter_t * iter ) { 115 78027 : iter->txn_map = *funk->txn_map; 116 78027 : iter->chain_cnt = fd_funk_txn_map_chain_cnt( funk->txn_map ); 117 78027 : iter->chain_idx = 0; 118 78027 : iter->txn_map_iter = fd_funk_txn_map_iter( funk->txn_map, 0 ); 119 78027 : fd_funk_txn_all_iter_skip_nulls( iter ); 120 78027 : } 121 : 122 : static inline int 123 1421907 : fd_funk_txn_all_iter_done( fd_funk_txn_all_iter_t const * iter ) { 124 1421907 : return iter->chain_idx == iter->chain_cnt; 125 1421907 : } 126 : 127 : FD_FN_UNUSED static void 128 1343880 : fd_funk_txn_all_iter_next( fd_funk_txn_all_iter_t * iter ) { 129 1343880 : iter->txn_map_iter = fd_funk_txn_map_iter_next( iter->txn_map_iter ); 130 1343880 : fd_funk_txn_all_iter_skip_nulls( iter ); 131 1343880 : } 132 : 133 : static inline fd_funk_txn_t const * 134 1343880 : fd_funk_txn_all_iter_ele_const( fd_funk_txn_all_iter_t * iter ) { 135 1343880 : return fd_funk_txn_map_iter_ele_const( iter->txn_map_iter ); 136 1343880 : } 137 : 138 : static inline fd_funk_txn_t * 139 0 : fd_funk_txn_all_iter_ele( fd_funk_txn_all_iter_t * iter ) { 140 0 : return fd_funk_txn_map_iter_ele( iter->txn_map_iter ); 141 0 : } 142 : 143 : FD_PROTOTYPES_END 144 : 145 : #endif /* HEADER_fd_src_funk_fd_funk_private_h */