Changeset f988834 for src/Common/utility.h
- Timestamp:
- Jan 19, 2024, 2:44:41 AM (8 months ago)
- Branches:
- master
- Children:
- ac939461
- Parents:
- 59c8dff (diff), e8b3717 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Common/utility.h
r59c8dff rf988834 10 10 // Created On : Mon May 18 07:44:20 2015 11 11 // Last Modified By : Andrew Beach 12 // Last Modified On : Fri Feb 17 15:25:00 202313 // Update Count : 5 312 // Last Modified On : Wed Jan 17 14:40:00 2024 13 // Update Count : 54 14 14 // 15 15 … … 17 17 18 18 #include <cassert> 19 #include <cctype>20 19 #include <algorithm> 21 #include <iostream>22 20 #include <list> 23 #include <memory>24 21 #include <string> 25 22 #include <type_traits> 26 23 #include <vector> 27 #include <cstring> // memcmp28 29 #include "Common/Indenter.h"30 31 class Expression;32 33 /// bring std::move into global scope34 using std::move;35 24 36 25 /// partner to move that copies any copyable type 37 26 template<typename T> 38 27 T copy( const T & x ) { return x; } 39 40 template< typename T >41 static inline T * maybeClone( const T *orig ) {42 if ( orig ) {43 return orig->clone();44 } else {45 return 0;46 } // if47 }48 49 template< typename Input_iterator >50 void printEnums( Input_iterator begin, Input_iterator end, const char * const *name_array, std::ostream &os ) {51 for ( Input_iterator i = begin; i != end; ++i ) {52 os << name_array[ *i ] << ' ';53 } // for54 }55 56 template< typename Container >57 void deleteAll( const Container &container ) {58 for ( const auto &i : container ) {59 delete i;60 } // for61 }62 63 template< typename Container >64 void printAll( const Container &container, std::ostream &os, Indenter indent = {} ) {65 for ( typename Container::const_iterator i = container.begin(); i != container.end(); ++i ) {66 if ( *i ) {67 os << indent;68 (*i)->print( os, indent );69 // need an endl after each element because it's not easy to know when each individual item should end70 os << std::endl;71 } // if72 } // for73 }74 75 template< typename SrcContainer, typename DestContainer >76 void cloneAll( const SrcContainer &src, DestContainer &dest ) {77 typename SrcContainer::const_iterator in = src.begin();78 std::back_insert_iterator< DestContainer > out( dest );79 while ( in != src.end() ) {80 *out++ = (*in++)->clone();81 } // while82 }83 84 template< typename SrcContainer, typename DestContainer, typename Predicate >85 void cloneAll_if( const SrcContainer &src, DestContainer &dest, Predicate pred ) {86 std::back_insert_iterator< DestContainer > out( dest );87 for ( auto x : src ) {88 if ( pred(x) ) {89 *out++ = x->clone();90 }91 } // while92 }93 94 template< typename Container >95 void assertAll( const Container &container ) {96 int count = 0;97 for ( typename Container::const_iterator i = container.begin(); i != container.end(); ++i ) {98 if ( !(*i) ) {99 std::cerr << count << " is null" << std::endl;100 } // if101 } // for102 }103 104 template < typename T >105 std::list<T> tail( std::list<T> l ) {106 if ( ! l.empty() ) {107 std::list<T> ret(++(l.begin()), l.end());108 return ret;109 } // if110 }111 112 template < typename T >113 std::list<T> flatten( std::list < std::list<T> > l) {114 typedef std::list <T> Ts;115 116 Ts ret;117 118 switch ( l.size() ) {119 case 0:120 return ret;121 case 1:122 return l.front();123 default:124 ret = flatten(tail(l));125 ret.insert(ret.begin(), l.front().begin(), l.front().end());126 return ret;127 } // switch128 }129 28 130 29 /// Splice src onto the end of dst, clearing src … … 143 42 } 144 43 145 template< typename... Args > 146 auto filter(Args&&... args) -> decltype(std::copy_if(std::forward<Args>(args)...)) { 147 return std::copy_if(std::forward<Args>(args)...); 148 } 149 150 template <typename E, typename UnaryPredicate, template< typename, typename...> class Container, typename... Args > 151 void filter( Container< E *, Args... > & container, UnaryPredicate pred, bool doDelete ) { 152 auto i = begin( container ); 153 while ( i != end( container ) ) { 154 auto it = next( i ); 155 if ( pred( *i ) ) { 156 if ( doDelete ) { 157 delete *i; 158 } // if 159 container.erase( i ); 160 } // if 161 i = it; 162 } // while 163 } 164 44 /// Remove elements that match pred from the container. 165 45 template<typename Container, typename Pred> 166 46 void erase_if( Container & cont, Pred && pred ) {
Note: See TracChangeset
for help on using the changeset viewer.