LCOV - code coverage report
Current view: top level - funk - fd_funk_private.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 51 54 94.4 %
Date: 2025-10-27 04:40:00 Functions: 15 24 62.5 %

          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       40644 : fd_funk_all_iter_skip_nulls( fd_funk_all_iter_t * iter ) {
      37       40644 :   if( iter->chain_idx == iter->chain_cnt ) return;
      38     2553147 :   while( fd_funk_rec_map_iter_done( iter->rec_map_iter ) ) {
      39     2513250 :     if( ++(iter->chain_idx) == iter->chain_cnt ) break;
      40     2512503 :     iter->rec_map_iter = fd_funk_rec_map_iter( &iter->rec_map, iter->chain_idx );
      41     2512503 :   }
      42       40644 : }
      43             : 
      44             : FD_FN_UNUSED static void
      45             : fd_funk_all_iter_new( fd_funk_t const *    funk,
      46         747 :                       fd_funk_all_iter_t * iter ) {
      47         747 :   iter->rec_map      = *funk->rec_map;
      48         747 :   iter->chain_cnt    = fd_funk_rec_map_chain_cnt( &iter->rec_map );
      49         747 :   iter->chain_idx    = 0;
      50         747 :   iter->rec_map_iter = fd_funk_rec_map_iter( &iter->rec_map, 0 );
      51         747 :   fd_funk_all_iter_skip_nulls( iter );
      52         747 : }
      53             : 
      54             : static inline int
      55       40644 : fd_funk_all_iter_done( fd_funk_all_iter_t const * iter ) {
      56       40644 :   return ( iter->chain_idx == iter->chain_cnt );
      57       40644 : }
      58             : 
      59             : FD_FN_UNUSED static void
      60       39897 : fd_funk_all_iter_next( fd_funk_all_iter_t * iter ) {
      61       39897 :   iter->rec_map_iter = fd_funk_rec_map_iter_next( iter->rec_map_iter );
      62       39897 :   fd_funk_all_iter_skip_nulls( iter );
      63       39897 : }
      64             : 
      65             : static inline fd_funk_rec_t const *
      66       13299 : fd_funk_all_iter_ele_const( fd_funk_all_iter_t * iter ) {
      67       13299 :   return fd_funk_rec_map_iter_ele_const( iter->rec_map_iter );
      68       13299 : }
      69             : 
      70             : static inline fd_funk_rec_t *
      71       26598 : fd_funk_all_iter_ele( fd_funk_all_iter_t * iter ) {
      72       26598 :   return fd_funk_rec_map_iter_ele( iter->rec_map_iter );
      73       26598 : }
      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        1680 : fd_funk_txn_all_iter_skip_nulls( fd_funk_txn_all_iter_t * iter ) {
     105        1680 :   if( iter->chain_idx == iter->chain_cnt ) return;
     106     1581018 :   while( fd_funk_txn_map_iter_done( iter->txn_map_iter ) ) {
     107     1579836 :     if( ++(iter->chain_idx) == iter->chain_cnt ) break;
     108     1579338 :     iter->txn_map_iter = fd_funk_txn_map_iter( &iter->txn_map, iter->chain_idx );
     109     1579338 :   }
     110        1680 : }
     111             : 
     112             : FD_FN_UNUSED static void
     113             : fd_funk_txn_all_iter_new( fd_funk_t const *        funk,
     114         498 :                           fd_funk_txn_all_iter_t * iter ) {
     115         498 :   iter->txn_map = *funk->txn_map;
     116         498 :   iter->chain_cnt = fd_funk_txn_map_chain_cnt( funk->txn_map );
     117         498 :   iter->chain_idx = 0;
     118         498 :   iter->txn_map_iter = fd_funk_txn_map_iter( funk->txn_map, 0 );
     119         498 :   fd_funk_txn_all_iter_skip_nulls( iter );
     120         498 : }
     121             : 
     122             : static inline int
     123        1680 : fd_funk_txn_all_iter_done( fd_funk_txn_all_iter_t const * iter ) {
     124        1680 :   return iter->chain_idx == iter->chain_cnt;
     125        1680 : }
     126             : 
     127             : FD_FN_UNUSED static void
     128        1182 : fd_funk_txn_all_iter_next( fd_funk_txn_all_iter_t * iter ) {
     129        1182 :   iter->txn_map_iter = fd_funk_txn_map_iter_next( iter->txn_map_iter );
     130        1182 :   fd_funk_txn_all_iter_skip_nulls( iter );
     131        1182 : }
     132             : 
     133             : static inline fd_funk_txn_t const *
     134        1182 : fd_funk_txn_all_iter_ele_const( fd_funk_txn_all_iter_t * iter ) {
     135        1182 :   return fd_funk_txn_map_iter_ele_const( iter->txn_map_iter );
     136        1182 : }
     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 */

Generated by: LCOV version 1.14