Changeset f988834 for src/Common


Ignore:
Timestamp:
Jan 19, 2024, 2:44:41 AM (7 months ago)
Author:
JiadaL <j82liang@…>
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.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/utility.h

    r59c8dff rf988834  
    1010// Created On       : Mon May 18 07:44:20 2015
    1111// Last Modified By : Andrew Beach
    12 // Last Modified On : Fri Feb 17 15:25:00 2023
    13 // Update Count     : 53
     12// Last Modified On : Wed Jan 17 14:40:00 2024
     13// Update Count     : 54
    1414//
    1515
     
    1717
    1818#include <cassert>
    19 #include <cctype>
    2019#include <algorithm>
    21 #include <iostream>
    2220#include <list>
    23 #include <memory>
    2421#include <string>
    2522#include <type_traits>
    2623#include <vector>
    27 #include <cstring>                                                                              // memcmp
    28 
    29 #include "Common/Indenter.h"
    30 
    31 class Expression;
    32 
    33 /// bring std::move into global scope
    34 using std::move;
    3524
    3625/// partner to move that copies any copyable type
    3726template<typename T>
    3827T 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         } // if
    47 }
    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         } // for
    54 }
    55 
    56 template< typename Container >
    57 void deleteAll( const Container &container ) {
    58         for ( const auto &i : container ) {
    59                 delete i;
    60         } // for
    61 }
    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 end
    70                         os << std::endl;
    71                 } // if
    72         } // for
    73 }
    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         } // while
    82 }
    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         } // while
    92 }
    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                 } // if
    101         } // for
    102 }
    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         } // if
    110 }
    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         } // switch
    128 }
    12928
    13029/// Splice src onto the end of dst, clearing src
     
    14342}
    14443
    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.
    16545template<typename Container, typename Pred>
    16646void erase_if( Container & cont, Pred && pred ) {
Note: See TracChangeset for help on using the changeset viewer.