forked from mia/Aegisub
71 lines
2.7 KiB
C++
71 lines
2.7 KiB
C++
// Copyright (c) 2010, Amar Takhar <verm@aegisub.org>
|
|
//
|
|
// Permission to use, copy, modify, and distribute this software for any
|
|
// purpose with or without fee is hereby granted, provided that the above
|
|
// copyright notice and this permission notice appear in all copies.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
|
|
#include <algorithm>
|
|
#include <boost/range/irange.hpp>
|
|
#include <string>
|
|
|
|
struct tm;
|
|
|
|
namespace agi {
|
|
namespace util {
|
|
/// Clamp `b` to the range [`a`,`c`]
|
|
template<typename T>
|
|
static inline T mid(T a, T b, T c) {
|
|
return std::max(a, std::min(b, c));
|
|
}
|
|
|
|
bool try_parse(std::string const& str, double *out);
|
|
bool try_parse(std::string const& str, int *out);
|
|
|
|
/// strftime, but on std::string rather than a fixed buffer
|
|
/// @param fmt strftime format string
|
|
/// @param tmptr Time to format, or nullptr for current time
|
|
/// @return The strftime-formatted string
|
|
std::string strftime(const char *fmt, const tm *tmptr = nullptr);
|
|
|
|
/// Case-insensitive find with proper case folding
|
|
/// @param haystack String to search
|
|
/// @param needle String to look for
|
|
/// @return make_pair(-1,-1) if `needle` could not be found, or a range equivalent to `needle` in `haystack` if it could
|
|
///
|
|
/// `needle` and `haystack` must both be in Normalization Form D. The size
|
|
/// of the match might be different from the size of `needle`, since it's
|
|
/// based on the unfolded length.
|
|
std::pair<size_t, size_t> ifind(std::string const& haystack, std::string const& needle);
|
|
|
|
/// Set the name of the calling thread in the Visual Studio debugger
|
|
/// @param name New name for the thread
|
|
void SetThreadName(const char *name);
|
|
|
|
/// A thin wrapper around this_thread::sleep_for that uses std::thread on
|
|
/// Windows (to avoid having to compile boost.thread) and boost::thread
|
|
/// elsewhere (because libstcc++ 4.7 is missing it).
|
|
void sleep_for(int ms);
|
|
|
|
// boost.range doesn't have wrappers for the C++11 stuff
|
|
template<typename Range, typename Predicate>
|
|
bool any_of(Range&& r, Predicate&& p) {
|
|
return std::any_of(std::begin(r), std::end(r), std::forward<Predicate>(p));
|
|
}
|
|
|
|
std::string ErrorString(int error);
|
|
|
|
template<typename Integer>
|
|
auto range(Integer end) -> decltype(boost::irange<Integer>(0, end)) {
|
|
return boost::irange<Integer>(0, end);
|
|
}
|
|
|
|
} // namespace util
|
|
} // namespace agi
|