source: src/Common/utility.h@ 6943a987

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors ctor deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since 6943a987 was 79970ed, checked in by Rob Schluntz <rschlunt@…>, 9 years ago

implement warnings for missing struct member constructor calls, remove bad clones

  • Property mode set to 100644
File size: 6.2 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// utility.h --
8//
9// Author : Richard C. Bilson
10// Created On : Mon May 18 07:44:20 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Wed Jun 8 17:33:59 2016
13// Update Count : 22
14//
15
16#ifndef _UTILITY_H
17#define _UTILITY_H
18
19#include <iostream>
20#include <sstream>
21#include <iterator>
22#include <string>
23#include <cctype>
24#include <list>
25
26template< typename T >
27static inline T * maybeClone( const T *orig ) {
28 if ( orig ) {
29 return orig->clone();
30 } else {
31 return 0;
32 } // if
33}
34
35template<typename T, typename U>
36struct maybeBuild_t {
37 static T * doit( const U *orig ) {
38 if ( orig ) {
39 return orig->build();
40 } else {
41 return 0;
42 } // if
43 }
44};
45
46template< typename T, typename U >
47static inline T * maybeBuild( const U *orig ) {
48 return maybeBuild_t<T,U>::doit(orig);
49}
50
51template< typename T, typename U >
52static inline T * maybeMoveBuild( const U *orig ) {
53 T* ret = maybeBuild<T>(orig);
54 delete orig;
55 return ret;
56}
57
58template< typename Input_iterator >
59void printEnums( Input_iterator begin, Input_iterator end, const char * const *name_array, std::ostream &os ) {
60 for ( Input_iterator i = begin; i != end; ++i ) {
61 os << name_array[ *i ] << ' ';
62 } // for
63}
64
65template< typename Container >
66void deleteAll( Container &container ) {
67 for ( typename Container::iterator i = container.begin(); i != container.end(); ++i ) {
68 delete *i;
69 } // for
70}
71
72template< typename Container >
73void printAll( const Container &container, std::ostream &os, int indent = 0 ) {
74 for ( typename Container::const_iterator i = container.begin(); i != container.end(); ++i ) {
75 if ( *i ) {
76 os << std::string( indent, ' ' );
77 (*i)->print( os, indent + 2 );
78 // need an endl after each element because it's not easy to know when each individual item should end
79 os << std::endl;
80 } // if
81 } // for
82}
83
84template< typename SrcContainer, typename DestContainer >
85void cloneAll( const SrcContainer &src, DestContainer &dest ) {
86 typename SrcContainer::const_iterator in = src.begin();
87 std::back_insert_iterator< DestContainer > out( dest );
88 while ( in != src.end() ) {
89 *out++ = (*in++)->clone();
90 } // while
91}
92
93template< typename Container >
94void assertAll( const Container &container ) {
95 int count = 0;
96 for ( typename Container::const_iterator i = container.begin(); i != container.end(); ++i ) {
97 if ( !(*i) ) {
98 std::cerr << count << " is null" << std::endl;
99 } // if
100 } // for
101}
102
103static inline std::string assign_strptr( const std::string *str ) {
104 if ( str == 0 ) {
105 return "";
106 } else {
107 std::string tmp;
108 tmp = *str;
109 delete str;
110 return tmp;
111 } // if
112}
113
114template< class T, typename ResultType, ResultType( T::* memfunc )() >
115ResultType dispatch( T *pT ) {
116 return (pT->*memfunc)();
117}
118
119template < typename T >
120std::list<T> tail( std::list<T> l ) {
121 if ( ! l.empty() ) {
122 std::list<T> ret(++(l.begin()), l.end());
123 return ret;
124 } // if
125}
126
127template < typename T >
128std::list<T> flatten( std::list < std::list<T> > l) {
129 typedef std::list <T> Ts;
130
131 Ts ret;
132
133 switch ( l.size() ) {
134 case 0:
135 return ret;
136 case 1:
137 return l.front();
138 default:
139 ret = flatten(tail(l));
140 ret.insert(ret.begin(), l.front().begin(), l.front().end());
141 return ret;
142 } // switch
143}
144
145template < typename T >
146void toString_single ( std::ostream & os, const T & value ) {
147 os << value;
148}
149
150template < typename T, typename... Params >
151void toString_single ( std::ostream & os, const T & value, const Params & ... params ) {
152 os << value;
153 toString_single( os, params ... );
154}
155
156template < typename ... Params >
157std::string toString ( const Params & ... params ) {
158 std::ostringstream os;
159 toString_single( os, params... );
160 return os.str();
161}
162
163template< class Constructed, typename Arg >
164Constructed *ctor( Arg arg ) {
165 Constructed *c = new Constructed( arg );
166 return c;
167}
168
169template< class Constructed, typename Arg >
170Constructed ctor_noptr( Arg arg ) {
171 return Constructed( arg );
172}
173
174template< typename T >
175void replace( std::list< T > &org, typename std::list< T >::iterator pos, std::list< T > &with ) {
176 typename std::list< T >::iterator next = pos; advance( next, 1 );
177
178 //if ( next != org.end() ) {
179 org.erase( pos );
180 org.splice( next, with );
181 //}
182
183 return;
184}
185
186template< typename T1, typename T2 >
187T2 *cast_ptr( T1 *from ) {
188 return dynamic_cast< T2 * >( from );
189}
190
191template< class Exception, typename Arg >
192void inline assert_throw( bool pred, Arg arg ) {
193 if (pred) throw Exception( arg );
194}
195
196template< typename T >
197struct is_null_pointer {
198 bool operator()( const T *ptr ) { return ( ptr == 0 ); }
199};
200
201template< class InputIterator, class OutputIterator, class Predicate >
202void filter(InputIterator begin, InputIterator end, OutputIterator out, Predicate pred) {
203 while ( begin++ != end )
204 if ( pred(*begin) ) *out++ = *begin;
205
206 return;
207}
208
209template< class InputIterator1, class InputIterator2, class OutputIterator >
210void zip( InputIterator1 b1, InputIterator1 e1, InputIterator2 b2, InputIterator2 e2, OutputIterator out ) {
211 while ( b1 != e1 && b2 != e2 )
212 *out++ = std::pair<typename InputIterator1::value_type, typename InputIterator2::value_type>(*b1++, *b2++);
213}
214
215template< class InputIterator1, class InputIterator2, class OutputIterator, class BinFunction >
216void zipWith( InputIterator1 b1, InputIterator1 e1, InputIterator2 b2, InputIterator2 e2, OutputIterator out, BinFunction func ) {
217 while ( b1 != e1 && b2 != e2 )
218 *out++ = func(*b1++, *b2++);
219}
220
221// it's nice to actually be able to increment iterators by an arbitrary amount
222template< typename Iterator >
223Iterator operator+(Iterator i, int inc) {
224 while ( inc > 0 ) {
225 ++i;
226 --inc;
227 }
228 return i;
229}
230
231template< typename T >
232void warn_single( const T & arg ) {
233 std::cerr << arg << std::endl;
234}
235
236template< typename T, typename... Params >
237void warn_single(const T & arg, const Params & ... params ) {
238 std::cerr << arg;
239 warn_single( params... );
240}
241
242template< typename... Params >
243void warn( const Params & ... params ) {
244 std::cerr << "Warning: ";
245 warn_single( params... );
246}
247
248#endif // _UTILITY_H
249
250// Local Variables: //
251// tab-width: 4 //
252// mode: c++ //
253// compile-command: "make install" //
254// End: //
Note: See TracBrowser for help on using the repository browser.