Advertisement
Guest User

Untitled

a guest
Feb 6th, 2020
171
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.71 KB | None | 0 0
  1.  
  2. class InserterBase {
  3. public:
  4.     virtual void InsertHelper(void *instr, void *insertPoint) const = 0;
  5. };
  6.  
  7. class SomeInserter final : public InserterBase {
  8. public:
  9.     void InsertHelper(void *instr, void *insertPoint) const override;
  10. };
  11.  
  12. // This class intentionally has no member variables. It only provides the
  13. // various CreateXxx methods.
  14. template<typename BuilderT>
  15. class IRBuilderImpl {
  16.     void Insert(void *instr) const {
  17.         const BuilderT *builder = static_cast<const BuilderT *>(this);
  18.         builder->Insert(instr);
  19.     }
  20.  
  21. public:
  22.     void CreateFoo() {
  23.         Insert(nullptr);
  24.     }
  25. };
  26.  
  27. class IRBuilder : public IRBuilderImpl<IRBuilder> {
  28.     void *m_insertPoint;
  29.     InserterBase &m_inserter;
  30.  
  31. public:
  32.     IRBuilder(void *insertPoint, InserterBase &inserter)
  33.         : m_insertPoint(insertPoint), m_inserter(inserter) {}
  34.  
  35.     void *GetInsertPoint() const { return m_insertPoint; }
  36.  
  37.     void Insert(void *foo) const {
  38.         m_inserter.InsertHelper(foo, GetInsertPoint());
  39.     }
  40. };
  41.  
  42. class SomeIRBuilder : public IRBuilderImpl<SomeIRBuilder> {
  43.     SomeInserter m_inserter;
  44.     IRBuilder m_genericBuilder;
  45.  
  46. public:
  47.     SomeIRBuilder(void *insertPoint) : m_genericBuilder(insertPoint, m_inserter) {}
  48.  
  49.     void *GetInsertPoint() const { return m_genericBuilder.GetInsertPoint(); }
  50.  
  51.     void Insert(void *foo) const {
  52.         m_inserter.InsertHelper(foo, GetInsertPoint());
  53.     }
  54.  
  55.     IRBuilder &GetGenericBuilder() { return m_genericBuilder; }
  56. };
  57.  
  58. void instantiateHelper(IRBuilder &builder) {
  59.     builder.CreateFoo();
  60. }
  61.  
  62. void instantiate(void *insertPoint) {
  63.     SomeIRBuilder some(insertPoint);
  64.     some.CreateFoo();
  65.     instantiateHelper(some.GetGenericBuilder());
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement