//===- TemplateInstCallback.h - Template Instantiation Callback - C++ --===//
 
//
 
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 
// See https://llvm.org/LICENSE.txt for license information.
 
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 
//
 
//===---------------------------------------------------------------------===//
 
//
 
// This file defines the TemplateInstantiationCallback class, which is the
 
// base class for callbacks that will be notified at template instantiations.
 
//
 
//===---------------------------------------------------------------------===//
 
 
 
#ifndef LLVM_CLANG_SEMA_TEMPLATEINSTCALLBACK_H
 
#define LLVM_CLANG_SEMA_TEMPLATEINSTCALLBACK_H
 
 
 
#include "clang/Sema/Sema.h"
 
 
 
namespace clang {
 
 
 
/// This is a base class for callbacks that will be notified at every
 
/// template instantiation.
 
class TemplateInstantiationCallback {
 
public:
 
  virtual ~TemplateInstantiationCallback() = default;
 
 
 
  /// Called before doing AST-parsing.
 
  virtual void initialize(const Sema &TheSema) = 0;
 
 
 
  /// Called after AST-parsing is completed.
 
  virtual void finalize(const Sema &TheSema) = 0;
 
 
 
  /// Called when instantiation of a template just began.
 
  virtual void atTemplateBegin(const Sema &TheSema,
 
                               const Sema::CodeSynthesisContext &Inst) = 0;
 
 
 
  /// Called when instantiation of a template is just about to end.
 
  virtual void atTemplateEnd(const Sema &TheSema,
 
                             const Sema::CodeSynthesisContext &Inst) = 0;
 
};
 
 
 
template <class TemplateInstantiationCallbackPtrs>
 
void initialize(TemplateInstantiationCallbackPtrs &Callbacks,
 
                const Sema &TheSema) {
 
  for (auto &C : Callbacks) {
 
    if (C)
 
      C->initialize(TheSema);
 
  }
 
}
 
 
 
template <class TemplateInstantiationCallbackPtrs>
 
void finalize(TemplateInstantiationCallbackPtrs &Callbacks,
 
              const Sema &TheSema) {
 
  for (auto &C : Callbacks) {
 
    if (C)
 
      C->finalize(TheSema);
 
  }
 
}
 
 
 
template <class TemplateInstantiationCallbackPtrs>
 
void atTemplateBegin(TemplateInstantiationCallbackPtrs &Callbacks,
 
                     const Sema &TheSema,
 
                     const Sema::CodeSynthesisContext &Inst) {
 
  for (auto &C : Callbacks) {
 
    if (C)
 
      C->atTemplateBegin(TheSema, Inst);
 
  }
 
}
 
 
 
template <class TemplateInstantiationCallbackPtrs>
 
void atTemplateEnd(TemplateInstantiationCallbackPtrs &Callbacks,
 
                   const Sema &TheSema,
 
                   const Sema::CodeSynthesisContext &Inst) {
 
  for (auto &C : Callbacks) {
 
    if (C)
 
      C->atTemplateEnd(TheSema, Inst);
 
  }
 
}
 
 
 
} // namespace clang
 
 
 
#endif