#include "coco/ADT/DLinkedList.h"
+#include <cassert>
#include <stdexcept>
namespace coco
*
* @note "ins" cannot be a null pointer
*/
-template <typename T> bool isa(const Instr *ins);
+template <typename T> bool isa(const Instr *ins)
+{
+ assert(ins != nullptr);
+ return dynamic_cast<const T *>(ins) != nullptr;
+}
/**
* @brief Cast as a derived instruction
* @note "safe_cast<T>(ins)" returns a null pointer if "ins" is not of T type
* @note "safe_cast<T>(ins)" returns a null pointer if "ins" is a null pointer
*/
-template <typename T> T *safe_cast(Instr *ins);
+template <typename T> T *safe_cast(Instr *ins)
+{
+ // NOTE dynamic_cast<T *>(nullptr) returns nullptr
+ return dynamic_cast<T *>(ins);
+}
} // namespace coco
template <> InstrList *DLinkedList<Instr, Block>::head(Block *b) { return b->instr(); }
-//
-// isa<T>
-//
-#define INSTR(Name) \
- template <> bool isa<Name>(const Instr *ins) \
- { \
- assert(ins != nullptr); \
- return ins->as##Name() != nullptr; \
- }
-#include "coco/IR/Instr.lst"
-#undef INSTR
-
-//
-// safe_cast<T>
-//
-#define INSTR(Name) \
- template <> Name *safe_cast<Name>(Instr * ins) { return (ins) ? ins->as##Name() : nullptr; }
-#include "coco/IR/Instr.lst"
-#undef INSTR
-
} // namespace coco