21#define YOI_PLATFORM "linux"
22#define YOI_DYLIB_SUFFIX "so"
23#elif defined(__APPLE__)
24#define YOI_PLATFORM "darwin"
25#define YOI_DYLIB_SUFFIX L"dylib"
27#pragma comment(lib, "ws2_32.lib")
28#define YOI_PLATFORM "win32"
29#define YOI_DYLIB_SUFFIX "dll"
31#define YOI_PLATFORM "unknown"
32#define YOI_DYLIB_SUFFIX "so"
35#if defined(__aarch64__)
36#define YOI_ARCH "arm64"
37#elif defined(__x86_64__)
38#define YOI_ARCH "amd64"
39#elif defined(__i386__)
40#define YOI_ARCH "i386"
44#define YOI_ARCH "unknown"
53 using vec = std::vector<t>;
70 std::basic_string<T>
trim(
const std::basic_string<T> &str) {
71 auto start = str.begin();
72 while (start != str.end() && std::isspace(*start))
78 }
while (end != start && std::isspace(*end));
80 return {start, end + 1};
99 template<
typename A,
typename B>
119 throw std::runtime_error(
"indexTable: invalid index");
126 throw std::runtime_error(
"indexTable: invalid index");
134 throw std::runtime_error(
"indexTable: invalid key");
156 template<
typename A,
typename B>
167 values[it->second].second = b;
177 throw std::out_of_range(
"indexTable: key already exists");
182 throw std::out_of_range(
"indexTable: empty table");
184 throw std::out_of_range(
"indexTableRefactored: invalid key");
186 return values[it->second].second;
194 throw std::out_of_range(
"indexTableRefactored: invalid index");
200 throw std::out_of_range(
"indexTableRefactored: invalid key");
208 if (pred(
values[i].first)) {
212 throw std::out_of_range(
"indexTableRefactored: no matching key found");
219 throw std::out_of_range(
"indexTableRefactored: invalid index");
227 typename std::vector<std::pair<A, B>>::iterator
it;
236 iterator(
typename std::vector<std::pair<A, B>>::iterator underlying_it) :
it(underlying_it) {}
270 return it - other.
it;
308 for (; i <
pool.size(); i++)
319 throw std::runtime_error(
"indexPool: invalid index");
325 return std::make_shared<T>(v);
330 template <
typename enumT, enumT TSize = enumT::FINAL>
332 using type = std::underlying_type_t<enumT>;
338 enumT value{
static_cast<enumT
>(0)};
344 constexpr auto operator*() const noexcept -> enumT {
return value; }
345 constexpr auto operator-> () const & noexcept -> const enumT* {
349 value =
static_cast<enumT
>(1 +
static_cast<type>(value));
363 [[nodiscard]]
constexpr auto size() const noexcept ->
type {
364 return static_cast<type>(TSize);
368 template <
typename string_t>
void replace_all(string_t &str,
const string_t &from,
const string_t &to) {
371 size_t start_pos = 0;
372 while ((start_pos = str.find(from, start_pos))!= string_t::npos) {
373 str.replace(start_pos, from.length(), to);
374 start_pos += to.length();
constexpr auto operator==(iterator i) -> bool
constexpr auto operator++() &noexcept -> iterator
constexpr auto operator!=(iterator i) -> bool
constexpr iterator() noexcept=default
constexpr auto operator*() const noexcept -> enumT
constexpr auto size() const noexcept -> type
constexpr auto cend() const noexcept -> iterator
constexpr auto cbegin() const noexcept -> iterator
constexpr auto end() const noexcept -> iterator
constexpr auto begin() const noexcept -> iterator
std::underlying_type_t< enumT > type
yoi::indexT put(const T &t)
T & operator[](yoi::indexT i)
bool operator!=(const iterator &other) const
std::pair< A, B > & operator*()
iterator(typename vec< std::pair< A, B > >::iterator it)
vec< std::pair< A, B > >::iterator it
vec< std::pair< A, B > > indexes
B & operator[](yoi::indexT k)
B & operator[](const A &k)
yoi::indexT getIndex(const A &k)
yoi::indexT put(const A &a, const B &b)
bool operator!=(const iterator &other) const
iterator(typename std::vector< std::pair< A, B > >::iterator underlying_it)
iterator & operator-=(difference_type n)
friend iterator operator+(difference_type n, const iterator &iter)
iterator & operator+=(difference_type n)
bool operator<(const iterator &other) const
bool operator==(const iterator &other) const
std::pair< A, B > value_type
std::random_access_iterator_tag iterator_category
bool operator>(const iterator &other) const
iterator operator-(difference_type n) const
reference operator*() const
difference_type operator-(const iterator &other) const
std::vector< std::pair< A, B > >::iterator it
std::ptrdiff_t difference_type
bool operator>=(const iterator &other) const
bool operator<=(const iterator &other) const
pointer operator->() const
iterator operator+(difference_type n) const
yoi::indexT put_create(const A &a, const B &b)
B & operator[](yoi::indexT k)
std::vector< std::pair< A, B > > values
B & operator[](const A &k)
yoi::indexT getIndex(const std::function< bool(const A &)> &pred)
std::map< A, yoi::indexT > indexes
yoi::indexT getIndex(const A &k)
yoi::indexT put(const A &a, const B &b)
bool contains(const A &k) const
const A & getKey(yoi::indexT i) const
std::string wstring2string(const std::wstring &v)
std::shared_ptr< T > managedPtr(const T &v)
void warning(yoi::indexT line, yoi::indexT col, const std::string &msg, const std::string &label)
void parseString(std::wistream &input, wstr &value)
void replace_all(string_t &str, const string_t &from, const string_t &to)
std::wstring string2wstring(const std::string &v)
yoi::wstr realpath(const std::wstring &path)
std::wstring whereIsHoshiLang()
thread_local yoi::wstr __current_file_path
wstr escapeString(const wstr &value)
void yoi_assert(bool condition, yoi::indexT line, yoi::indexT col, const std::string &msg)
Asserts a condition that would be true and throws a runtime_error if it is false.
std::wstring get_line_hint_for_error(const std::wstring &file, yoi::indexT line, yoi::indexT col)
void set_current_file_path(const std::wstring &path)
std::map< std::string, ExceptionHandleType > exception_categories
std::basic_string< T > trim(const std::basic_string< T > &str)
void panic(yoi::indexT line, yoi::indexT col, const std::string &msg)