Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class InserterBase {
- public:
- virtual void InsertHelper(void *instr, void *insertPoint) const = 0;
- };
- class SomeInserter final : public InserterBase {
- public:
- void InsertHelper(void *instr, void *insertPoint) const override;
- };
- // This class intentionally has no member variables. It only provides the
- // various CreateXxx methods.
- template<typename BuilderT>
- class IRBuilderImpl {
- void Insert(void *instr) const {
- const BuilderT *builder = static_cast<const BuilderT *>(this);
- builder->Insert(instr);
- }
- public:
- void CreateFoo() {
- Insert(nullptr);
- }
- };
- class IRBuilder : public IRBuilderImpl<IRBuilder> {
- void *m_insertPoint;
- InserterBase &m_inserter;
- public:
- IRBuilder(void *insertPoint, InserterBase &inserter)
- : m_insertPoint(insertPoint), m_inserter(inserter) {}
- void *GetInsertPoint() const { return m_insertPoint; }
- void Insert(void *foo) const {
- m_inserter.InsertHelper(foo, GetInsertPoint());
- }
- };
- class SomeIRBuilder : public IRBuilderImpl<SomeIRBuilder> {
- SomeInserter m_inserter;
- IRBuilder m_genericBuilder;
- public:
- SomeIRBuilder(void *insertPoint) : m_genericBuilder(insertPoint, m_inserter) {}
- void *GetInsertPoint() const { return m_genericBuilder.GetInsertPoint(); }
- void Insert(void *foo) const {
- m_inserter.InsertHelper(foo, GetInsertPoint());
- }
- IRBuilder &GetGenericBuilder() { return m_genericBuilder; }
- };
- void instantiateHelper(IRBuilder &builder) {
- builder.CreateFoo();
- }
- void instantiate(void *insertPoint) {
- SomeIRBuilder some(insertPoint);
- some.CreateFoo();
- instantiateHelper(some.GetGenericBuilder());
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement