LCOV - code coverage report
Current view: top level - funk - fd_funk_private.h (source / functions) Hit Total Coverage
Test: cov.lcov Lines: 48 54 88.9 %
Date: 2025-10-13 04:42:14 Functions: 19 60 31.7 %

          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 */

Generated by: LCOV version 1.14