1 #ifndef _theplu_yat_utility_utility_ 2 #define _theplu_yat_utility_utility_ 36 #include "concept_check.h" 38 #include "Exception.h" 39 #include "iterator_traits.h" 40 #include "WeightIterator.h" 41 #include "yat_assert.h" 43 #include <boost/iterator/iterator_concepts.hpp> 44 #include <boost/concept_check.hpp> 77 std::string
basename(
const std::string& fn);
92 const unsigned char type_size=
sizeof(T);
93 YAT_ASSERT(type_size <= 16);
95 is.read(buffer, type_size);
96 memcpy(&x, buffer, type_size);
115 const unsigned char type_size=
sizeof(T);
116 YAT_ASSERT(type_size <= 16);
118 memcpy(buffer, &x, type_size);
119 os.write(buffer, type_size);
141 template<
typename InputIterator,
typename OutputIterator>
143 OutputIterator result);
155 void chdir(
const std::string& dir);
165 void chmod(
const std::string& filename, mode_t mode);
174 template<
typename charT,
class Traits,
class Allocator>
175 bool contains(
const std::basic_string<charT, Traits, Allocator>& str,
176 const std::basic_string<charT, Traits, Allocator>& substr);
179 template<
typename charT,
class Traits,
class Allocator>
180 bool contains(
const std::basic_string<charT, Traits, Allocator>& str,
184 template<
typename charT,
class Traits,
class Allocator>
185 bool contains(
const std::basic_string<charT, Traits, Allocator>& str,
186 const charT* substr);
209 T
convert(
const std::string& s);
230 void copy_file(
const std::string& source,
const std::string& target);
243 std::string
dirname(
const std::string& fn);
252 template<
typename charT,
class Traits,
class Allocator>
253 bool ends_with(
const std::basic_string<charT, Traits, Allocator>& str,
254 const std::basic_string<charT, Traits, Allocator>& suffix);
257 template<
typename charT,
class Traits,
class Allocator>
258 bool ends_with(
const std::basic_string<charT, Traits, Allocator>& str,
262 template<
typename charT,
class Traits,
class Allocator>
263 bool ends_with(
const std::basic_string<charT, Traits, Allocator>& str,
264 const charT* suffix);
276 bool fnmatch(
const std::string& pattern,
const std::string& str,
298 int line,
int gsl_errno);
306 bool is(
const std::string& s);
314 bool is_double(
const std::string&) YAT_DEPRECATE;
324 bool is_equal(std::string s, std::string other);
332 bool is_float(
const std::string&) YAT_DEPRECATE;
340 bool is_int(
const std::string&) YAT_DEPRECATE;
345 bool is_nan(
const std::string& s);
383 void load(std::istream&
is, std::vector<std::vector<T> >& vec,
char sep=
'\0',
384 char line_sep=
'\n',
bool ignore_empty=
false,
bool rectangle=
true);
408 void load(std::istream&
is, std::vector<T>& vec,
char sep=
'\0');
429 void mkdir(
const std::string& dir, mode_t mode=0777);
438 void mkdir_p(
const std::string& dir, mode_t mode=0777);
446 #define YAT_MOVE(arg) std::move(arg) 447 #define YAT_MOVE_IF_NOEXCEPT(arg) std::move_if_noexcept(arg) 461 void print_what(
const std::exception& error, std::ostream& out=std::cerr);
470 void remove(
const std::string& fn);
480 void rename(
const std::string& from,
const std::string& to);
491 void replace(std::string& full_str,
const std::string& old_str,
492 const std::string& new_str);
502 template<
typename charT,
class Traits,
class Allocator>
503 bool starts_with(
const std::basic_string<charT, Traits, Allocator>& str,
504 const std::basic_string<charT, Traits, Allocator>& prefix);
507 template<
typename charT,
class Traits,
class Allocator>
508 bool starts_with(
const std::basic_string<charT, Traits, Allocator>& str,
512 template<
typename charT,
class Traits,
class Allocator>
513 bool starts_with(
const std::basic_string<charT, Traits, Allocator>& str,
514 const charT* prefix);
528 template<
typename Iterator>
529 double sum_weight(Iterator first, Iterator last);
541 void symlink(
const std::string& path1,
const std::string& path2);
559 void operator()(
const std::string& element, std::vector<T>& vec)
562 vec.push_back(std::numeric_limits<T>::quiet_NaN());
564 vec.push_back(convert<T>(element));
575 struct VectorPusher<
std::string>
580 void operator()(
const std::string& element, std::vector<std::string>& vec)
582 vec.push_back(element);
585 void operator()(std::string&& element, std::vector<std::string>& vec)
587 vec.push_back(std::move(element));
592 template<
typename Iterator>
593 double sum_weight(Iterator first, Iterator last, unweighted_iterator_tag tag)
595 return std::distance(first, last);
599 template<
typename Iterator>
600 double sum_weight(Iterator first, Iterator last, weighted_iterator_tag tag)
602 return std::accumulate(weight_iterator(first), weight_iterator(last), 0);
612 template<
typename InputIterator,
typename OutputIterator>
614 OutputIterator result)
616 BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<InputIterator>));
617 BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<InputIterator>));
618 BOOST_CONCEPT_ASSERT((boost_concepts::IncrementableIterator<OutputIterator>));
619 BOOST_CONCEPT_ASSERT((boost_concepts::WritableIterator<OutputIterator, float>));
622 while (first!=last) {
623 if (std::isnan(*first)) {
636 template<
typename charT,
class Traits,
class Allocator>
637 bool contains(
const std::basic_string<charT, Traits, Allocator>& str,
638 const std::basic_string<charT, Traits, Allocator>& substr)
640 #ifdef YAT_HAVE_FUNC_STRING_CONTAINS 641 return str.contains(substr);
643 return str.find(substr)!=std::basic_string<charT, Traits,Allocator>::npos;
648 template<
typename charT,
class Traits,
class Allocator>
649 bool contains(
const std::basic_string<charT, Traits, Allocator>& str,
652 #ifdef YAT_HAVE_FUNC_STRING_CONTAINS 653 return str.contains(substr);
655 return str.find(substr)!=std::basic_string<charT, Traits,Allocator>::npos;
660 template<
typename charT,
class Traits,
class Allocator>
661 bool contains(
const std::basic_string<charT, Traits, Allocator>& str,
664 #ifdef YAT_HAVE_FUNC_STRING_CONTAINS 665 return str.contains(substr);
667 return str.find(substr)!=std::basic_string<charT, Traits,Allocator>::npos;
675 std::ostringstream ss;
686 throw runtime_error(std::string(
"yat::utility::convert(\"")+s+
692 template<
typename charT,
class Traits,
class Allocator>
693 bool ends_with(
const std::basic_string<charT, Traits, Allocator>& str,
694 const std::basic_string<charT, Traits, Allocator>& suffix)
696 #ifdef YAT_HAVE_FUNC_STRING_ENDS_WITH 697 return str.ends_with(suffix);
699 size_t n = suffix.size();
700 return n <= str.size() && !str.compare(str.size()-n, n, suffix);
705 template<
typename charT,
class Traits,
class Allocator>
706 bool ends_with(
const std::basic_string<charT, Traits, Allocator>& str,
709 #ifdef YAT_HAVE_FUNC_STRING_ENDS_WITH 710 return str.ends_with(suffix);
713 return str.size() && traits.eq(str.back(), suffix);
718 template<
typename charT,
class Traits,
class Allocator>
719 bool ends_with(
const std::basic_string<charT, Traits, Allocator>& str,
722 #ifdef YAT_HAVE_FUNC_STRING_ENDS_WITH 723 return str.ends_with(suffix);
726 size_t n = traits.length(suffix);
727 return n <= str.size() && !str.compare(str.size()-n, n, suffix);
733 bool is(
const std::string& s)
741 void load(std::istream&
is, std::vector<std::vector<T> >& matrix,
742 char sep,
char line_sep,
bool ignore_empty,
745 size_t nof_columns=0;
747 while(getline(
is, line, line_sep)){
748 if (line.empty() && ignore_empty)
751 v.reserve(nof_columns);
752 bool empty_last_element = !line.empty() && line.back()==sep;
753 std::stringstream ss(std::move(line));
756 detail::VectorPusher<T> pusher;
757 if (empty_last_element && sep!=
'\0')
760 if (rectangle && nof_columns && v.size()!=nof_columns) {
761 std::ostringstream s;
762 s <<
"load stream error: " 763 <<
"line " << matrix.size() <<
" has " << v.size()
764 <<
" columns; expected " << nof_columns <<
" columns.";
767 nof_columns =
std::max(nof_columns, v.size());
768 matrix.push_back(std::move(v));
772 is.clear(std::ios::goodbit);
776 void load(std::istream&
is, std::vector<T>& vec,
char sep)
778 detail::VectorPusher<T> pusher;
784 getline(
is, element, sep);
787 pusher(std::move(element), vec);
792 template<
typename charT,
class Traits,
class Allocator>
793 bool starts_with(
const std::basic_string<charT, Traits, Allocator>& str,
794 const std::basic_string<charT, Traits, Allocator>& prefix)
796 #ifdef YAT_HAVE_FUNC_STRING_STARTS_WITH 797 return str.starts_with(prefix);
799 size_t n = prefix.size();
800 return n <= str.size() && !str.compare(0, n, prefix);
805 template<
typename charT,
class Traits,
class Allocator>
806 bool starts_with(
const std::basic_string<charT, Traits, Allocator>& str,
809 #ifdef YAT_HAVE_FUNC_STRING_STARTS_WITH 810 return str.starts_with(prefix);
813 return str.size() && traits.eq(str[0], prefix);
818 template<
typename charT,
class Traits,
class Allocator>
819 bool starts_with(
const std::basic_string<charT, Traits, Allocator>& str,
822 #ifdef YAT_HAVE_FUNC_STRING_STARTS_WITH 823 return str.starts_with(prefix);
826 size_t n = traits.length(prefix);
827 return n <= str.size() && !str.compare(0, n, prefix);
832 template<
typename Iterator>
836 BOOST_CONCEPT_ASSERT((boost_concepts::ReadableIterator<Iterator>));
837 BOOST_CONCEPT_ASSERT((boost_concepts::SinglePassIterator<Iterator>));
847 if (!std::numeric_limits<T>::is_signed) {
849 std::string::const_iterator iter = s.begin();
850 while (iter!=s.end() && std::isspace(*iter))
854 if (iter==s.end() || *iter==
'-')
857 std::istringstream ss(s);
861 result = std::numeric_limits<T>::quiet_NaN();
865 result = std::numeric_limits<T>::infinity();
870 YAT_ASSERT(std::numeric_limits<T>::is_signed);
871 result = -std::numeric_limits<T>::infinity();
bool is(const std::string &s)
check if string is convertible to (numerical) type T
Definition: utility.h:733
bool is_int(const std::string &)
detail::weighted_iterator_traits_detail< value >::type type
Definition: iterator_traits.h:114
void chdir(const std::string &dir)
std::string dirname(const std::string &fn)
void symlink(const std::string &path1, const std::string &path2)
Concept check for Data Iterator.
Definition: concept_check.h:240
double sum_weight(Iterator first, Iterator last)
Definition: utility.h:833
void rename(const std::string &from, const std::string &to)
The Department of Theoretical Physics namespace as we define it.
void copy_file(const std::string &source, const std::string &target)
Copy file source to target.
bool ends_with(const std::basic_string< charT, Traits, Allocator > &str, const std::basic_string< charT, Traits, Allocator > &suffix)
Definition: utility.h:693
Definition: stl_utility.h:64
bool is_double(const std::string &)
bool is_float(const std::string &)
void mkdir_p(const std::string &dir, mode_t mode=0777)
T max(const T &a, const T &b, const T &c)
Definition: stl_utility.h:699
void print_what(const std::exception &error, std::ostream &out=std::cerr)
recursively print exception what
Class used for all runtime error detected within yat library.
Definition: Exception.h:53
void chmod(const std::string &filename, mode_t mode)
bool is_nan(const std::string &s)
std::string getcwd(void)
current directory
void gsl_error_handler(const char *reason, const char *file, int line, int gsl_errno)
void replace(std::string &full_str, const std::string &old_str, const std::string &new_str)
bool is_equal(std::string s, std::string other)
bool fnmatch(const std::string &pattern, const std::string &str, int flags=0)
Class to report errors associated with IO operations.
Definition: Exception.h:124
bool binary_weight(InputIterator first, InputIterator last, OutputIterator result)
Definition: utility.h:613
T log2(T x)
Definition: utility.h:418
bool contains(const std::basic_string< charT, Traits, Allocator > &str, const std::basic_string< charT, Traits, Allocator > &substr)
Definition: utility.h:637
void binary_write(std::ostream &os, T x)
Definition: utility.h:113
void load(std::istream &is, std::vector< std::vector< T > > &vec, char sep='\0', char line_sep='\n', bool ignore_empty=false, bool rectangle=true)
Definition: utility.h:741
bool convert_try(const std::string &s, T &t)
try to convert
Definition: utility.h:845
std::string basename(const std::string &fn)
void mkdir(const std::string &dir, mode_t mode=0777)
create a directory dir
std::string convert(T input)
convert T to a string
Definition: utility.h:673
bool starts_with(const std::basic_string< charT, Traits, Allocator > &str, const std::basic_string< charT, Traits, Allocator > &prefix)
Definition: utility.h:793
std::istream & binary_read(std::istream &is, T &x)
Definition: utility.h:90