80 lines
2.8 KiB
C++
80 lines
2.8 KiB
C++
#pragma once
|
|
#include "3rdparty/easylogging++.h"
|
|
#include <algorithm>
|
|
#include <any>
|
|
#include <bitset>
|
|
#include <cassert>
|
|
#include <exception>
|
|
#include <iterator>
|
|
#include <list>
|
|
#include <map>
|
|
#include <memory>
|
|
#include <optional>
|
|
#include <set>
|
|
#include <sstream>
|
|
#include <string>
|
|
#include <unordered_map>
|
|
#include <unordered_set>
|
|
#include <vector>
|
|
|
|
#define uptr(type) std::unique_ptr<type>
|
|
#define sptr(type) std::shared_ptr<type>
|
|
|
|
template <typename DST, typename SRC>
|
|
inline sptr(DST) shared_cast(SRC src) {
|
|
return std::dynamic_pointer_cast<DST>(src);
|
|
}
|
|
|
|
template <typename DST, typename SRC>
|
|
inline sptr(DST) strict_shared_cast(SRC src) {
|
|
sptr(DST) dst = std::dynamic_pointer_cast<DST>(src);
|
|
assert(dst);
|
|
return dst;
|
|
}
|
|
|
|
#define STD_FIND(container, val) std::find(container.begin(), container.end(), val)
|
|
#define STD_FOUND(container, val) (STD_FIND(container, val) != container.end())
|
|
#define ASSOC_FOUND(cont, val) (cont.find(val) != cont.end())
|
|
|
|
#define panic(message) \
|
|
do { \
|
|
throw GrammarException(__FILE__, __LINE__, (message)); \
|
|
} while (0)
|
|
|
|
#define sysy_assert(cond) \
|
|
do { \
|
|
if (!(cond)) throw GrammarException(__FILE__, __LINE__, #cond); \
|
|
} while (0)
|
|
|
|
#define DEF_PTR_T(type) \
|
|
class type; \
|
|
typedef std::shared_ptr<type> type##Ptr_t
|
|
|
|
namespace CompSysY {
|
|
|
|
template <typename T>
|
|
std::ostream &operator<<(typename std::enable_if<std::is_enum<T>::value, std::ostream>::type &stream, const T &e) {
|
|
return stream << static_cast<typename std::underlying_type<T>::type>(e);
|
|
}
|
|
|
|
class GrammarException : public std::exception {
|
|
public:
|
|
GrammarException() : message("Unknown Grammar Exception") {}
|
|
GrammarException(const std::string &what_arg) : message(what_arg){};
|
|
GrammarException(const char *what_arg) : message(what_arg){};
|
|
GrammarException(const char *filename, int line, const char *what_arg) {
|
|
std::ostringstream ss;
|
|
ss << filename << ":" << line << ": "
|
|
<< "\x1b[031m" << what_arg << "\x1b[0m";
|
|
message = ss.str();
|
|
};
|
|
|
|
virtual const char *what() const noexcept {
|
|
return message.c_str();
|
|
}
|
|
|
|
private:
|
|
std::string message;
|
|
};
|
|
|
|
} // namespace CompSysY
|