11 #include <initializer_list> 20 #include <type_traits> 21 #include <unordered_map> 25 #include <hilti/rt/filesystem.h> 26 #include <hilti/rt/unpack.h> 27 #include <hilti/rt/util.h> 29 #include <hilti/autogen/config.h> 30 #include <hilti/base/result.h> 34 void __internal_error(
const std::string& s);
37 #undef TINYFORMAT_ERROR 38 #define TINYFORMAT_ERROR(reason) ::util::detail::__internal_error(reason) 39 #include <hilti/rt/3rdparty/tinyformat/tinyformat.h> 50 #define _UNUSED(x) ((void)(x)); 53 #define IF_DERIVED_FROM(t, cls) typename std::enable_if_t<std::is_base_of<cls, t>::value>* = nullptr 56 #define IF_NOT_DERIVED_FROM(t, cls) typename std::enable_if_t<! std::is_base_of<cls, t>::value>* = nullptr 59 #define IF_SAME(t, cls) typename std::enable_if_t<std::is_same<cls, t>::value>* = nullptr 62 #define IF_NOT_SAME(t, cls) typename std::enable_if_t<! std::is_same<cls, t>::value>* = nullptr 75 return demangle(
typeid(T).name());
79 template<
typename... Args>
80 std::string
fmt(
const char*
fmt,
const Args&... args) {
81 return tfm::format(fmt, args...);
85 template<
typename X,
typename F>
87 using Y =
typename std::result_of<F(X&)>::type;
90 for (
const auto& i : x )
96 template<
typename X,
typename F>
98 using Y =
typename std::result_of<F(X&)>::type;
100 for (
const auto& i : x )
106 template<
typename X,
typename F>
107 auto transform(
const std::initializer_list<X>& x, F f) {
108 using Y =
typename std::result_of<F(X&)>::type;
110 for (
const auto& i : x )
111 y.emplace_back(f(i));
116 template<
typename X,
typename F>
118 using Y =
typename std::result_of<F(X&)>::type;
121 for (
const auto& i : x )
127 template<
typename X,
typename F>
128 auto filter(
const std::vector<X>& x, F f) {
131 for (
const auto& i : x )
138 template<
typename X,
typename F>
141 for (
const auto& i : x )
151 template<
typename T,
typename TIter = decltype(std::begin(std::declval<T>())),
152 typename = decltype(std::end(std::declval<T>()))>
157 bool operator!=(
const iterator& other)
const {
return iter != other.iter; }
162 auto operator*()
const {
return std::tie(i, *iter); }
164 struct iterable_wrapper {
166 auto begin() {
return iterator{0, std::begin(iterable)}; }
167 auto end() {
return iterator{0, std::end(iterable)}; }
169 return iterable_wrapper{std::forward<T>(iterable)};
173 extern std::vector<std::string>
split(std::string s,
const std::string& delim =
" ");
179 extern std::pair<std::string, std::string>
split1(std::string s,
const std::string& delim =
" ");
185 extern std::pair<std::string, std::string>
rsplit1(std::string s,
const std::string& delim =
" ");
196 std::vector<T>
slice(
const std::vector<T>& v,
int begin,
int end = -1) {
198 begin = v.size() + begin;
200 if ( static_cast<size_t>(begin) > v.size() )
204 end = v.size() + end + 1;
212 if ( static_cast<size_t>(end) > v.size() )
215 return std::vector<T>(v.begin() + begin, v.begin() + end);
223 std::string
join(
const T& l,
const std::string& delim =
"") {
227 for (
const auto& i : l ) {
230 result += std::string(i);
242 std::string
join(
const std::initializer_list<T>& l,
const std::string& delim =
"") {
246 for (
const auto& i : l ) {
249 result += std::string(i);
260 template<
typename iterator>
261 std::string
join(
const iterator& begin,
const iterator& end,
const std::string& delim =
"") {
265 for ( iterator i = begin; i != end; i++ ) {
268 result += std::string(*i);
293 extern std::string
prefixParts(
const std::string& in,
const std::string& prefix,
const std::string& include_tag =
"");
305 extern std::vector<std::string>
flattenParts(
const std::vector<std::string>& in);
308 extern std::string
replace(
const std::string& s,
const std::string& o,
const std::string& n);
311 extern std::string
tolower(
const std::string& s);
314 extern std::string
toupper(
const std::string& s);
317 extern std::string
trim(
const std::string& s);
320 extern std::string
rtrim(
const std::string& s);
323 extern std::string
ltrim(
const std::string& s);
326 inline bool startsWith(
const std::string& s,
const std::string& prefix) {
return s.find(prefix) == 0; }
329 extern bool endsWith(
const std::string& s,
const std::string& suffix);
332 extern uint64_t
hash(
const std::string& str);
335 extern uint64_t
hash(
const char* data,
size_t len);
343 case 8:
return std::make_pair(INT8_MIN, INT8_MAX);
344 case 16:
return std::make_pair(INT16_MIN, INT16_MAX);
345 case 32:
return std::make_pair(INT32_MIN, INT32_MAX);
346 case 64:
return std::make_pair(INT64_MIN, INT64_MAX);
347 default:
throw std::out_of_range(
"unsupported integer width");
357 case 8:
return std::make_pair(0, UINT8_MAX);
358 case 16:
return std::make_pair(0, UINT16_MAX);
359 case 32:
return std::make_pair(0, UINT32_MAX);
360 case 64:
return std::make_pair(0, UINT64_MAX);
361 default:
throw std::out_of_range(
"unsupported integer width");
372 template<
typename Error>
376 auto u = strtoul(dgts, &cp, base);
377 if ( cp == dgts || *cp !=
'\0' || (u == ULONG_MAX && errno == ERANGE) ) {
390 template<
typename Error>
394 auto d = strtod(dgts, &cp);
395 if ( cp == dgts || *cp !=
'\0' || (d == HUGE_VAL && errno == ERANGE) ) {
413 extern std::string
uitoa_n(uint64_t value,
unsigned int base,
int n = -1);
415 using hilti::rt::escapeBytes;
416 using hilti::rt::escapeUTF8;
417 using hilti::rt::expandEscapes;
426 inline std::string
escapeBytesForCxx(std::string_view s) {
return escapeBytes(std::move(s),
true,
true); }
437 extern std::string
toIdentifier(
const std::string& s,
bool ensure_non_keyword =
false);
444 const std::vector<hilti::rt::filesystem::path>& paths);
464 template<
class Iter,
typename Result>
474 template<
typename A,
typename B>
475 std::list<std::pair<A, B>>
zip2(
const std::list<A>& lhs,
const std::list<B>& rhs) {
476 std::list<std::pair<A, B>> result;
477 for ( std::pair<
typename std::list<A>::const_iterator,
typename std::list<B>::const_iterator> iter =
478 std::pair<
typename std::list<A>::const_iterator,
typename std::list<B>::const_iterator>(lhs.cbegin(),
480 iter.first != lhs.end() and iter.second != rhs.end(); ++iter.first, ++iter.second )
481 result.emplace_back(*iter.first, *iter.second);
490 template<
typename A,
typename B>
491 std::vector<std::pair<A, B>>
zip2(
const std::vector<A>& lhs,
const std::vector<B>& rhs) {
492 std::vector<std::pair<A, B>> result;
493 for ( std::pair<
typename std::vector<A>::const_iterator,
typename std::vector<B>::const_iterator> iter =
494 std::pair<
typename std::vector<A>::const_iterator,
typename std::vector<B>::const_iterator>(lhs.cbegin(),
496 iter.first != lhs.end() and iter.second != rhs.end(); ++iter.first, ++iter.second )
497 result.emplace_back(*iter.first, *iter.second);
502 template<
typename A,
typename B>
506 for (
const auto& i : m )
513 template<
typename A,
typename B>
517 for (
const auto& i : m )
524 template<
typename A,
typename B>
525 std::set<A>
map_keys(
const std::unordered_map<A, B>& m) {
528 for (
const auto& i : m )
535 template<
typename A,
typename B>
539 for (
const auto& i : m )
546 template<
typename A,
typename Compare = std::less<A>>
547 std::set<A, Compare>
set_difference(
const std::set<A, Compare>& a,
const std::set<A, Compare>& b) {
548 std::set<A, Compare> r;
549 std::set_difference(a.begin(), a.end(), b.begin(), b.end(), std::inserter(r, r.end()), Compare());
554 template<
typename A,
typename Compare = std::less<A>>
556 std::set<A, Compare> r;
557 std::set_intersection(a.begin(), a.end(), b.begin(), b.end(), std::inserter(r, r.end()), Compare());
562 template<
typename A,
typename Compare = std::less<A>>
563 std::set<A, Compare>
set_union(
const std::set<A, Compare>& a,
const std::set<A, Compare>& b) {
564 std::set<A, Compare> r;
565 std::set_union(a.begin(), a.end(), b.begin(), b.end(), std::inserter(r, r.end()), Compare());
571 std::vector<T>
concat(std::vector<T> v1,
const std::vector<T>& v2) {
572 v1.reserve(v1.size() + v2.size());
573 v1.insert(v1.end(), v2.begin(), v2.end());
579 std::vector<T>&
append(std::vector<T>& v1,
const std::vector<T>& v2) {
580 v1.reserve(v1.size() + v2.size());
581 v1.insert(v1.end(), v2.begin(), v2.end());
591 for (
auto&& i : v ) {
592 if ( seen.find(i) != seen.end() )
596 out.emplace_back(std::move(i));
609 if ( c.find(hint) == c.end() )
616 std::string idx =
fmt(
"%s.%d", hint, ++cnt);
617 if ( c.find(idx) == c.end() )
623 inline bool copyStream(std::istream& in, std::ostream& out) {
625 while ( in.good() ) {
626 in.read(buffer,
sizeof(buffer));
627 out.write(buffer,
sizeof(buffer));
652 template<
typename Enum, std::
size_t Size>
653 constexpr
auto from_string(
const std::string_view name,
const Value<Enum> (&values)[Size]) {
654 for (
const auto& v : values )
655 if ( v.name == name )
658 throw std::out_of_range(name.data());
671 template<
typename Enum, std::
size_t Size>
672 constexpr
auto to_string(Enum value,
const Value<Enum> (&values)[Size]) {
673 for (
const auto& v : values )
674 if ( v.value == value )
677 throw std::out_of_range(std::to_string(static_cast<int>(value)));
688 std::optional<hilti::rt::filesystem::path>
cacheDirectory(
const hilti::Configuration& configuration);
std::string replace(const std::string &s, const std::string &o, const std::string &n)
Definition: util.cc:69
std::set< B > map_values(const std::map< A, B > &m)
Definition: util.h:514
auto transform_to_vector(const std::set< X > &x, F f)
Definition: util.h:117
std::string toupper(const std::string &s)
Definition: util.cc:90
std::vector< T > remove_duplicates(std::vector< T > v)
Definition: util.h:587
std::string trim(const std::string &s)
Definition: util.cc:108
std::pair< std::string, std::string > split1(std::string s, const std::string &delim=" ")
Definition: util.cc:55
std::pair< std::string, std::string > rsplit1(std::string s, const std::string &delim=" ")
Definition: util.cc:62
std::string typename_()
Definition: util.h:74
uint64_t chars_to_uint64(const char *dgts, unsigned int base, Error handler)
Definition: util.h:373
void abort_with_backtrace()
Definition: util.cc:180
constexpr auto enumerate(T &&iterable)
Definition: util.h:153
constexpr std::pair< intmax_t, intmax_t > signed_integer_range(int width)
Definition: util.h:341
Definition: optional.h:79
std::string demangle(const std::string &symbol)
Definition: backtrace.h:39
uint64_t hash(const std::string &str)
Definition: util.cc:110
hilti::rt::filesystem::path normalizePath(const hilti::rt::filesystem::path &p)
Definition: util.cc:102
std::set< A, Compare > set_union(const std::set< A, Compare > &a, const std::set< A, Compare > &b)
Definition: util.h:563
Iter atoi_n(Iter s, Iter e, int base, Result *result)
Definition: util.h:377
std::vector< T > concat(std::vector< T > v1, const std::vector< T > &v2)
Definition: util.h:571
hilti::rt::Result< hilti::rt::filesystem::path > createTemporaryFile(const std::string &prefix="")
Definition: util.cc:84
std::set< A, Compare > set_intersection(std::set< A, Compare > &a, std::set< A, Compare > &b)
Definition: util.h:555
std::string tolower(const std::string &s)
Definition: util.cc:84
std::list< std::pair< A, B > > zip2(const std::list< A > &lhs, const std::list< B > &rhs)
Definition: util.h:475
std::vector< std::string > split(std::string s, const std::string &delim=" ")
Definition: util.cc:35
std::vector< T > & append(std::vector< T > &v1, const std::vector< T > &v2)
Definition: util.h:579
double chars_to_double(const char *dgts, Error handler)
Definition: util.h:391
void cannot_be_reached() __attribute__((noreturn))
Definition: util.cc:33
std::string prefixParts(const std::string &in, const std::string &prefix, const std::string &include_tag="")
Definition: util.cc:240
double currentTime()
Definition: util.cc:188
std::string fmt(const char *fmt, const Args &... args)
Definition: util.h:80
bool startsWith(const std::string &s, const std::string &prefix)
Definition: util.h:326
std::string join(const T &l, const std::string &delim="")
Definition: util.h:223
bool copyStream(std::istream &in, std::ostream &out)
Definition: util.h:623
std::set< A, Compare > set_difference(const std::set< A, Compare > &a, const std::set< A, Compare > &b)
Definition: util.h:547
std::optional< hilti::rt::filesystem::path > cacheDirectory(const hilti::Configuration &configuration)
Definition: util.cc:283
bool endsWith(const std::string &s, const std::string &suffix)
Definition: util.cc:136
std::vector< std::string > flattenParts(const std::vector< std::string > &in)
Definition: util.cc:267
std::string ltrim(const std::string &s)
Definition: util.cc:102
constexpr std::pair< uintmax_t, uintmax_t > unsigned_integer_range(int width)
Definition: util.h:355
auto atoi_n(Iter s, Iter e, int base, Result *result)
Definition: util.h:465
auto transform(const std::vector< X > &x, F f)
Definition: util.h:86
std::string uniqueIndex(const T &c, std::string hint)
Definition: util.h:608
std::string rtrim(const std::string &s)
Definition: util.cc:96
std::set< A > map_keys(const std::map< A, B > &m)
Definition: util.h:503
std::string uitoa_n(uint64_t value, unsigned int base, int n=-1)
Definition: util.cc:121
std::string escapeBytesForCxx(std::string_view s)
Definition: util.h:426
std::vector< T > slice(const std::vector< T > &v, int begin, int end=-1)
Definition: util.h:196
hilti::rt::filesystem::path currentExecutable()
Definition: util.cc:163
hilti::Result< hilti::rt::filesystem::path > findInPaths(const hilti::rt::filesystem::path &file, const std::vector< hilti::rt::filesystem::path > &paths)
Definition: util.cc:145
auto filter(const std::vector< X > &x, F f)
Definition: util.h:128
std::string toIdentifier(const std::string &s, bool ensure_non_keyword=false)
Definition: util.cc:194