LCOV - code coverage report
Current view: top level - opt/homebrew/include/boost/test/utils - foreach.hpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 33 36 91.7 %
Date: 2026-06-25 07:23:43 Functions: 102 158 64.6 %

          Line data    Source code
       1             : //  (C) Copyright Eric Niebler 2004-2005
       2             : //  (C) Copyright Gennadiy Rozental 2001.
       3             : //  Distributed under the Boost Software License, Version 1.0.
       4             : //  (See accompanying file LICENSE_1_0.txt or copy at
       5             : //  http://www.boost.org/LICENSE_1_0.txt)
       6             : 
       7             : //  See http://www.boost.org/libs/test for the library home page.
       8             : //
       9             : //  File        : $RCSfile$
      10             : //
      11             : //  Version     : $Revision$
      12             : //
      13             : //  Description : this is an abridged version of an excelent BOOST_FOREACH facility
      14             : //  presented by Eric Niebler. I am so fond of it so I can't wait till it
      15             : //  going to be accepted into Boost. Also I need version with less number of dependencies
      16             : //  and more portable. This version doesn't support rvalues and will reeveluate it's
      17             : //  parameters, but should be good enough for my purposes.
      18             : // ***************************************************************************
      19             : 
      20             : #ifndef BOOST_TEST_UTILS_FOREACH_HPP
      21             : #define BOOST_TEST_UTILS_FOREACH_HPP
      22             : 
      23             : // Boost.Test
      24             : #include <boost/test/detail/config.hpp>
      25             : 
      26             : // Boost
      27             : #include <boost/type.hpp>
      28             : #include <boost/mpl/bool.hpp>
      29             : 
      30             : #include <boost/type_traits/is_const.hpp>
      31             : 
      32             : #include <boost/test/detail/suppress_warnings.hpp>
      33             : 
      34             : //____________________________________________________________________________//
      35             : 
      36             : namespace boost {
      37             : namespace unit_test {
      38             : namespace for_each {
      39             : 
      40             : // ************************************************************************** //
      41             : // **************                  static_any                  ************** //
      42             : // ************************************************************************** //
      43             : 
      44             : struct static_any_base
      45             : {
      46    18667612 :     operator bool() const { return false; }
      47             : };
      48             : 
      49             : //____________________________________________________________________________//
      50             : 
      51             : template<typename Iter>
      52             : struct static_any : static_any_base
      53             : {
      54    37335224 :     static_any( Iter const& t ) : m_it( t ) {}
      55             : 
      56             :     mutable Iter m_it;
      57             : };
      58             : 
      59             : //____________________________________________________________________________//
      60             : 
      61             : typedef static_any_base const& static_any_t;
      62             : 
      63             : //____________________________________________________________________________//
      64             : 
      65             : template<typename Iter>
      66             : inline Iter&
      67    97674514 : static_any_cast( static_any_t a, Iter* = 0 )
      68             : {
      69    97674514 :     return static_cast<Iter&>( static_cast<static_any<Iter> const&>( a ).m_it );
      70             : }
      71             : 
      72             : //____________________________________________________________________________//
      73             : 
      74             : // ************************************************************************** //
      75             : // **************                   is_const                   ************** //
      76             : // ************************************************************************** //
      77             : 
      78             : template<typename C>
      79             : inline is_const<C>
      80    87256595 : is_const_coll( C& )
      81             : {
      82    87256595 :     return is_const<C>();
      83             : }
      84             : 
      85             : //____________________________________________________________________________//
      86             : 
      87             : // ************************************************************************** //
      88             : // **************                     begin                    ************** //
      89             : // ************************************************************************** //
      90             : 
      91             : template<typename C>
      92             : inline static_any<BOOST_DEDUCED_TYPENAME C::iterator>
      93     8890968 : begin( C& t, mpl::false_ )
      94             : {
      95     8890968 :     return static_any<BOOST_DEDUCED_TYPENAME C::iterator>( t.begin() );
      96             : }
      97             : 
      98             : //____________________________________________________________________________//
      99             : 
     100             : template<typename C>
     101             : inline static_any<BOOST_DEDUCED_TYPENAME C::const_iterator>
     102      442838 : begin( C const& t, mpl::true_ )
     103             : {
     104      442838 :     return static_any<BOOST_DEDUCED_TYPENAME C::const_iterator>( t.begin() );
     105             : }
     106             : 
     107             : //____________________________________________________________________________//
     108             : 
     109             : // ************************************************************************** //
     110             : // **************                      end                     ************** //
     111             : // ************************************************************************** //
     112             : 
     113             : template<typename C>
     114             : inline static_any<BOOST_DEDUCED_TYPENAME C::iterator>
     115     8890968 : end( C& t, mpl::false_ )
     116             : {
     117     8890968 :     return static_any<BOOST_DEDUCED_TYPENAME C::iterator>( t.end() );
     118             : }
     119             : 
     120             : //____________________________________________________________________________//
     121             : 
     122             : template<typename C>
     123             : inline static_any<BOOST_DEDUCED_TYPENAME C::const_iterator>
     124      442838 : end( C const& t, mpl::true_ )
     125             : {
     126      442838 :     return static_any<BOOST_DEDUCED_TYPENAME C::const_iterator>( t.end() );
     127             : }
     128             : 
     129             : //____________________________________________________________________________//
     130             : 
     131             : // ************************************************************************** //
     132             : // **************                      done                    ************** //
     133             : // ************************************************************************** //
     134             : 
     135             : template<typename C>
     136             : inline bool
     137    26827936 : done( static_any_t cur, static_any_t end, C&, mpl::false_ )
     138             : {
     139    53655872 :     return  static_any_cast<BOOST_DEDUCED_TYPENAME C::iterator>( cur ) ==
     140    26827936 :             static_any_cast<BOOST_DEDUCED_TYPENAME C::iterator>( end );
     141             : }
     142             : 
     143             : //____________________________________________________________________________//
     144             : 
     145             : template<typename C>
     146             : inline bool
     147     2257595 : done( static_any_t cur, static_any_t end, C const&, mpl::true_ )
     148             : {
     149     4515190 :     return  static_any_cast<BOOST_DEDUCED_TYPENAME C::const_iterator>( cur ) ==
     150     2257595 :             static_any_cast<BOOST_DEDUCED_TYPENAME C::const_iterator>( end );
     151             : }
     152             : 
     153             : //____________________________________________________________________________//
     154             : 
     155             : // ************************************************************************** //
     156             : // **************                      next                    ************** //
     157             : // ************************************************************************** //
     158             : 
     159             : template<typename C>
     160             : inline void
     161    17934493 : next( static_any_t cur, C&, mpl::false_ )
     162             : {
     163    17934493 :     ++static_any_cast<BOOST_DEDUCED_TYPENAME C::iterator>( cur );
     164    17934493 : }
     165             : 
     166             : //____________________________________________________________________________//
     167             : 
     168             : template<typename C>
     169             : inline void
     170     1814757 : next( static_any_t cur, C const&, mpl::true_ )
     171             : {
     172     1814757 :     ++static_any_cast<BOOST_DEDUCED_TYPENAME C::const_iterator>( cur );
     173     1814757 : }
     174             : 
     175             : //____________________________________________________________________________//
     176             : 
     177             : // ************************************************************************** //
     178             : // **************                      prev                    ************** //
     179             : // ************************************************************************** //
     180             : 
     181             : template<typename C>
     182             : inline void
     183        2475 : prev( static_any_t cur, C&, mpl::false_ )
     184             : {
     185        2475 :     --static_any_cast<BOOST_DEDUCED_TYPENAME C::iterator>( cur );
     186        2475 : }
     187             : 
     188             : //____________________________________________________________________________//
     189             : 
     190             : template<typename C>
     191             : inline void
     192           0 : prev( static_any_t cur, C const&, mpl::true_ )
     193             : {
     194           0 :     --static_any_cast<BOOST_DEDUCED_TYPENAME C::const_iterator>( cur );
     195           0 : }
     196             : 
     197             : //____________________________________________________________________________//
     198             : 
     199             : // ************************************************************************** //
     200             : // **************                      deref                   ************** //
     201             : // ************************************************************************** //
     202             : 
     203             : template<class RefType,typename C>
     204             : inline RefType
     205    17936968 : deref( static_any_t cur, C&, ::boost::type<RefType>, mpl::false_ )
     206             : {
     207    17936968 :     return *static_any_cast<BOOST_DEDUCED_TYPENAME C::iterator>( cur );
     208             : }
     209             : 
     210             : //____________________________________________________________________________//
     211             : 
     212             : template<class RefType,typename C>
     213             : inline RefType
     214     1814759 : deref( static_any_t cur, C const&, ::boost::type<RefType>, mpl::true_ )
     215             : {
     216     1814759 :     return *static_any_cast<BOOST_DEDUCED_TYPENAME C::const_iterator>( cur );
     217             : }
     218             : 
     219             : //____________________________________________________________________________//
     220             : 
     221             : // ************************************************************************** //
     222             : // **************              BOOST_TEST_FOREACH              ************** //
     223             : // ************************************************************************** //
     224             : 
     225             : #define BOOST_TEST_FE_ANY                   ::boost::unit_test::for_each::static_any_t
     226             : #define BOOST_TEST_FE_IS_CONST( COL )       ::boost::unit_test::for_each::is_const_coll( COL )
     227             : 
     228             : #define BOOST_TEST_FE_BEG( COL )            \
     229             :     ::boost::unit_test::for_each::begin(    \
     230             :         COL,                                \
     231             :         BOOST_TEST_FE_IS_CONST( COL ) )     \
     232             : /**/
     233             : 
     234             : #define BOOST_TEST_FE_END( COL )            \
     235             :     ::boost::unit_test::for_each::end(      \
     236             :         COL,                                \
     237             :         BOOST_TEST_FE_IS_CONST( COL ) )     \
     238             : /**/
     239             : 
     240             : #define BOOST_TEST_FE_DONE( COL )           \
     241             :     ::boost::unit_test::for_each::done(     \
     242             :         BOOST_TEST_FE_CUR_VAR,              \
     243             :         BOOST_TEST_FE_END_VAR,              \
     244             :         COL,                                \
     245             :         BOOST_TEST_FE_IS_CONST( COL ) )     \
     246             : /**/
     247             : 
     248             : #define BOOST_TEST_FE_NEXT( COL )           \
     249             :     ::boost::unit_test::for_each::next(     \
     250             :         BOOST_TEST_FE_CUR_VAR,              \
     251             :         COL,                                \
     252             :         BOOST_TEST_FE_IS_CONST( COL ) )     \
     253             : /**/
     254             : 
     255             : #define BOOST_TEST_FE_PREV( COL )           \
     256             :     ::boost::unit_test::for_each::prev(     \
     257             :         BOOST_TEST_FE_CUR_VAR,              \
     258             :         COL,                                \
     259             :         BOOST_TEST_FE_IS_CONST( COL ) )     \
     260             : /**/
     261             : 
     262             : #define BOOST_FOREACH_NOOP(COL)             \
     263             :     ((void)&(COL))
     264             : 
     265             : #define BOOST_TEST_FE_DEREF( COL, RefType ) \
     266             :     ::boost::unit_test::for_each::deref(    \
     267             :         BOOST_TEST_FE_CUR_VAR,              \
     268             :         COL,                                \
     269             :         ::boost::type<RefType >(),          \
     270             :         BOOST_TEST_FE_IS_CONST( COL ) )     \
     271             : /**/
     272             : 
     273             : #if BOOST_WORKAROUND( BOOST_MSVC, == 1310 )
     274             : #define BOOST_TEST_LINE_NUM
     275             : #else
     276             : #define BOOST_TEST_LINE_NUM     __LINE__
     277             : #endif
     278             : 
     279             : #define BOOST_TEST_FE_CUR_VAR   BOOST_JOIN( _fe_cur_, BOOST_TEST_LINE_NUM )
     280             : #define BOOST_TEST_FE_END_VAR   BOOST_JOIN( _fe_end_, BOOST_TEST_LINE_NUM )
     281             : #define BOOST_TEST_FE_CON_VAR   BOOST_JOIN( _fe_con_, BOOST_TEST_LINE_NUM )
     282             : 
     283             : #define BOOST_TEST_FOREACH( RefType, var, COL )                                             \
     284             : if( BOOST_TEST_FE_ANY BOOST_TEST_FE_CUR_VAR = BOOST_TEST_FE_BEG( COL ) ) {} else            \
     285             : if( BOOST_TEST_FE_ANY BOOST_TEST_FE_END_VAR = BOOST_TEST_FE_END( COL ) ) {} else            \
     286             : for( bool BOOST_TEST_FE_CON_VAR = true;                                                     \
     287             :           BOOST_TEST_FE_CON_VAR && !BOOST_TEST_FE_DONE( COL );                              \
     288             :           BOOST_TEST_FE_CON_VAR ? BOOST_TEST_FE_NEXT( COL ) : BOOST_FOREACH_NOOP( COL ))    \
     289             :                                                                                             \
     290             :     if( (BOOST_TEST_FE_CON_VAR = false, false) ) {} else                                    \
     291             :     for( RefType var = BOOST_TEST_FE_DEREF( COL, RefType );                                 \
     292             :          !BOOST_TEST_FE_CON_VAR; BOOST_TEST_FE_CON_VAR = true )                             \
     293             : /**/
     294             : 
     295             : #define BOOST_TEST_REVERSE_FOREACH( RefType, var, COL )                                     \
     296             : if( BOOST_TEST_FE_ANY BOOST_TEST_FE_CUR_VAR = BOOST_TEST_FE_END( COL ) ) {} else            \
     297             : if( BOOST_TEST_FE_ANY BOOST_TEST_FE_END_VAR = BOOST_TEST_FE_BEG( COL ) ) {} else            \
     298             : for( bool BOOST_TEST_FE_CON_VAR = true;                                                     \
     299             :           BOOST_TEST_FE_CON_VAR && !BOOST_TEST_FE_DONE( COL ); )                            \
     300             :                                                                                             \
     301             :     if( (BOOST_TEST_FE_CON_VAR = false, false) ) {} else                                    \
     302             :     if( (BOOST_TEST_FE_PREV( COL ), false) ) {} else                                        \
     303             :     for( RefType var = BOOST_TEST_FE_DEREF( COL, RefType );                                 \
     304             :          !BOOST_TEST_FE_CON_VAR; BOOST_TEST_FE_CON_VAR = true )                             \
     305             : /**/
     306             : 
     307             : //____________________________________________________________________________//
     308             : 
     309             : } // namespace for_each
     310             : } // namespace unit_test
     311             : } // namespace boost
     312             : 
     313             : #include <boost/test/detail/enable_warnings.hpp>
     314             : 
     315             : #endif // BOOST_TEST_UTILS_FOREACH_HPP

Generated by: LCOV version 1.16