1#ifndef AMPGEN_UTILITIES_H
2#define AMPGEN_UTILITIES_H
23 template <
typename iterator_type,
24 typename functor_type>
27 const std::string& delim,
31 if( begin == end )
return "";
32 for (
auto it = begin; it != end-1; ++it)
33 ss <<
fcn(*it) << delim;
38 template <
typename container_type,
39 typename vtype =
typename container_type::value_type,
40 typename functor_type = std::function<vtype(
const vtype&)> >
41 std::string
vectorToString(
const container_type& obj,
const std::string& delim =
"",
const functor_type& f = [](
const auto& arg){
return arg; })
46 template <
typename T> std::vector<std::vector<T>>
nCr(
const T& n,
const T& r )
48 std::vector<bool> mask( n );
49 std::vector<std::vector<T>> combinations;
50 std::fill( mask.begin() + r, mask.end(),
true );
53 for ( T i = 0; i < n; ++i )
if ( !mask[i] ) perm.push_back(i);
54 combinations.push_back( perm );
55 }
while ( std::next_permutation( mask.begin(), mask.end() ) );
59 std::vector<std::string>
vectorFromFile(
const std::string& filename,
const char ignoreLinesThatBeginWith =
'#' );
61 std::vector<std::string>
split(
const std::string&,
char,
bool =
true);
62 std::vector<std::string>
split(
const std::string&,
const std::vector<char>&,
bool=
false );
64 std::vector<size_t>
findAll(
const std::string& input,
const std::string& ch );
66 std::map<size_t, std::string>
vecFindAll(
const std::string& input,
const std::vector<std::string>& vCh );
68 size_t find_next_of(
const std::string& input,
const std::vector<std::string>& patterns,
const size_t& begin = 0 );
70 std::string
replaceAll(
const std::string& input,
const std::string& toReplace,
const std::string& replaceWith );
71 std::string
replaceAll(
const std::string& input,
const std::vector<std::pair<std::string, std::string>>& rules );
75 std::vector<std::string>
getItems(
const std::string& tree,
const std::vector<std::string>& brackets = {
"{",
"}"},
76 const std::string& seperator =
"," );
78 void swapChars(std::string& arg,
const char a,
const char b );
80 unsigned int editDistance(
const std::string& s1,
const std::string& s2 );
82 std::string
round(
const double& number,
const unsigned int& nsf );
84 std::string
numberWithError(
const double& number,
const double& error,
const unsigned int& nDigits );
86 template <
typename return_type>
95 template <
class ...ARGS>
98 auto size = std::snprintf(
nullptr, 0, format.c_str(), std::forward<ARGS>(args)...);
99 std::string output (size+1,
'\0');
100 std::snprintf(&output[0],size+1, format.c_str(), std::forward<ARGS>(args)...);
101 return output.substr(0, output.size()-1);
105 template <>
double lexical_cast(
const std::string& word,
bool& status );
106 template <>
unsigned int lexical_cast(
const std::string& word,
bool& status );
107 template <> std::string
lexical_cast(
const std::string& word,
bool& status );
108 template <>
float lexical_cast(
const std::string& word,
bool& status );
109 template <>
bool lexical_cast(
const std::string& word,
bool& status );
111 template <>
unsigned long int lexical_cast(
const std::string& word,
bool& status );
112 template <>
long int lexical_cast(
const std::string& word,
bool& status );
114 template <
typename functor_type>
115 void processFile(
const std::string& filename, functor_type&& toDo,
const char ignoreLinesThatBeginWith =
'#' )
118 std::ifstream inFile( filename.c_str() );
119 while ( inFile.good() ) {
120 std::getline( inFile, tmp );
121 tmp.erase( std::remove_if( tmp.begin(), tmp.end(), [](
const char c){ return c ==
'\r'; }), tmp.end() );
122 if ( ignoreLinesThatBeginWith !=
'\0' && ( tmp.size() == 0 || tmp[0] == ignoreLinesThatBeginWith ) )
continue;
129 std::pair<size_t,int>
minSwaps(
const std::vector<size_t>& indices,
const std::vector<int>& exchangeParities);
131 template<
class iterator,
135 const comparator& comp,
136 const size_t& grainsize)
138 const size_t len = end - begin;
139 if(len < grainsize) std::sort(begin, end, comp);
142 const auto middle = begin + len/2;
146 std::inplace_merge(begin, middle, end, comp);
150 template<
class iterator,
155 const initial_value& init,
159 auto size = end-begin;
161 #pragma omp parallel for reduction( +: total )
163 for(
int it = 0; it < size; ++it ){
164 total += f(*(begin+it));
168 template <
typename return_type,
typename contained_type> std::function<return_type(
const contained_type&)>
171 return [values](
const contained_type& event) -> return_type {
return *(values.data() + event.index()); };
174 template <
typename T> std::vector<std::vector<T>>
all_combinations(
const std::vector< std::vector<T>>& elements )
177 for(
const auto & s : elements ) nc *= s.size();
178 std::vector< std::vector<T>> comb (nc, std::vector<T>(elements.size(), 0));
179 for(
int i = 0 ; i != comb.size(); ++i )
182 for(
int j = elements.size()-1 ; j >= 0; --j )
184 int t = counter % elements[j].size();
185 counter = ( counter - t ) / elements[j].size();
186 comb[i][j] = elements[j][t];
193 template<
class iterator>
196 const size_t& grainsize)
198 typedef typename std::iterator_traits<iterator>::value_type value_type;
203 const char wildcard_character =
'*' );
205 bool isDir(
const std::string& fname );
208 std::vector<std::string>
getListOfFiles(
const std::string& directory,
const std::string& patternString =
"");
215 std::string
trim(
const std::string& s );
#define WARNING(X)
Used for printing warning messages, can be switched off using WARNINGLEVEL.
void parallel_sort(iterator begin, iterator end, const comparator &comp, const size_t &grainsize)
size_t find_next_of(const std::string &input, const std::vector< std::string > &patterns, const size_t &begin=0)
std::vector< size_t > findAll(const std::string &input, const std::string &ch)
bool isDir(const std::string &fname)
std::vector< std::string > getItems(const std::string &tree, const std::vector< std::string > &brackets={"{", "}"}, const std::string &seperator=",")
std::string vectorToString(iterator_type begin, iterator_type end, const std::string &delim, functor_type fcn)
bool stringMatchesWildcard(const std::string &input, const std::string &wildcard_string, const char wildcard_character=' *')
std::vector< std::string > split(const std::string &, char, bool=true)
void printReleaseNotes(const std::string &fname)
std::ostream & italic_off(std::ostream &)
std::pair< size_t, int > minSwaps(const std::vector< size_t > &indices, const std::vector< int > &exchangeParities)
std::vector< std::string > vectorFromFile(const std::string &filename, const char ignoreLinesThatBeginWith='#')
std::vector< std::string > getListOfFiles(const std::string &directory, const std::string &patternString="")
initial_value parallel_accumulate(iterator begin, iterator end, const initial_value &init, const functor &f)
std::function< return_type(const contained_type &)> arrayToFunctor(const std::vector< return_type > &values)
std::map< size_t, std::string > vecFindAll(const std::string &input, const std::vector< std::string > &vCh)
unsigned int FNV1a_hash(const std::string &toHash)
std::string round(const double &number, const unsigned int &nsf)
std::vector< std::vector< T > > all_combinations(const std::vector< std::vector< T > > &elements)
std::string numberWithError(const double &number, const double &error, const unsigned int &nDigits)
std::ostream & bold_on(std::ostream &)
void processFile(const std::string &filename, functor_type &&toDo, const char ignoreLinesThatBeginWith='#')
std::ostream & bold_off(std::ostream &)
std::string trim(const std::string &s)
std::string replaceAll(const std::string &input, const std::string &toReplace, const std::string &replaceWith)
std::string mysprintf(const std::string &format, ARGS &&... args)
std::string rtrim(std::string s)
std::vector< std::vector< T > > nCr(const T &n, const T &r)
void swapChars(std::string &arg, const char a, const char b)
std::string type_string()
Utility classes for compile-time metaprogramming, such as identifying the types of arguments for gene...
bool fileExists(const std::string &name)
return_type lexical_cast(const std::string &word, bool &status)
std::ostream & italic_on(std::ostream &)
unsigned int editDistance(const std::string &s1, const std::string &s2)
std::string expandGlobals(std::string path)
std::string ltrim(std::string s)