Logo ROOT   6.07/09
Reference Guide
Classes | Namespaces | Typedefs | Enumerations | Functions | Variables
TMetaUtils.h File Reference
#include "RConversionRuleParser.h"
#include <set>
#include <string>
#include <unordered_set>
#include <stdlib.h>
#include "ESTLType.h"
#include "TClassEdit.h"
#include "Varargs.h"
Include dependency graph for TMetaUtils.h:
This graph shows which files directly or indirectly include this file:

Classes

class  ROOT::TMetaUtils::AnnotatedRecordDecl
 
struct  ROOT::TMetaUtils::AnnotatedRecordDecl::CompareByName
 
class  ROOT::TMetaUtils::RConstructorType
 
class  ROOT::TMetaUtils::TClingLookupHelper
 
class  ROOT::TMetaUtils::TNormalizedCtxt
 

Namespaces

 clang
 
 cling
 Print a TSeq at the prompt:
 
 cling::utils
 
 cling::utils::Transform
 
 llvm
 
 ROOT
 This namespace contains pre-defined functions to be used in conjuction with TExecutor::Map and TExecutor::MapReduce.
 
 ROOT::TMetaUtils
 
 ROOT::TMetaUtils::AST2SourceTools
 
 ROOT::TMetaUtils::propNames
 

Typedefs

typedef void(* ROOT::TMetaUtils::CallWriteStreamer_t) (const AnnotatedRecordDecl &cl, const cling::Interpreter &interp, const TNormalizedCtxt &normCtxt, std::ostream &dictStream, bool isAutoStreamer)
 
typedef std::list< RConstructorType > ROOT::TMetaUtils::RConstructorTypes
 

Enumerations

enum  ROOT::TMetaUtils::DataMemberInfo__ValidArrayIndex_error_code {
  ROOT::TMetaUtils::VALID, ROOT::TMetaUtils::NOT_INT, ROOT::TMetaUtils::NOT_DEF, ROOT::TMetaUtils::IS_PRIVATE,
  ROOT::TMetaUtils::UNKNOWN
}
 
enum  ROOT::TMetaUtils::EIOCtorCategory : short { ROOT::TMetaUtils::EIOCtorCategory::kAbsent, ROOT::TMetaUtils::EIOCtorCategory::kDefault, ROOT::TMetaUtils::EIOCtorCategory::kIOPtrType, ROOT::TMetaUtils::EIOCtorCategory::kIORefType }
 

Functions

clang::QualType ROOT::TMetaUtils::AddDefaultParameters (clang::QualType instanceType, const cling::Interpreter &interpret, const TNormalizedCtxt &normCtxt)
 Add any unspecified template parameters to the class template instance, mentioned anywhere in the type. More...
 
bool ROOT::TMetaUtils::BeginsWith (const std::string &theString, const std::string &theSubstring)
 
EIOCtorCategory ROOT::TMetaUtils::CheckConstructor (const clang::CXXRecordDecl *, const RConstructorType &, const cling::Interpreter &interp)
 
bool ROOT::TMetaUtils::CheckPublicFuncWithProto (clang::CXXRecordDecl const *, char const *, char const *, const cling::Interpreter &, bool diagnose)
 
const clang::FunctionDecl * ROOT::TMetaUtils::ClassInfo__HasMethod (const clang::DeclContext *cl, char const *, const cling::Interpreter &interp)
 
static const std::string ROOT::TMetaUtils::propNames::comment ("comment")
 
void ROOT::TMetaUtils::CreateNameTypeMap (clang::CXXRecordDecl const &, std::map< std::string, ROOT::Internal::TSchemaType, std::less< std::string >, std::allocator< std::pair< std::string const, ROOT::Internal::TSchemaType > > > &)
 
llvm::StringRef ROOT::TMetaUtils::DataMemberInfo__ValidArrayIndex (const clang::DeclaratorDecl &m, int *errnum=0, llvm::StringRef *errstr=0)
 ValidArrayIndex return a static string (so use it or copy it immediatly, do not call GrabIndex twice in the same expression) containing the size of the array data member. More...
 
clang::Module * ROOT::TMetaUtils::declareModuleMap (clang::CompilerInstance *CI, const char *moduleFileName, const char *headers[])
 Declare a virtual module.map to clang. Returns Module on success. More...
 
const std::string ROOT::TMetaUtils::AST2SourceTools::Decls2FwdDecls (const std::vector< const clang::Decl * > &decls, bool(*ignoreFiles)(const clang::PresumedLoc &), const cling::Interpreter &interp)
 
int ROOT::TMetaUtils::ElementStreamer (std::ostream &finalString, const clang::NamedDecl &forcontext, const clang::QualType &qti, const char *t, int rwmode, const cling::Interpreter &interp, const char *tcl=0)
 
int ROOT::TMetaUtils::AST2SourceTools::EncloseInNamespaces (const clang::Decl &decl, std::string &defString)
 Take the namespaces which enclose the decl and put them around the definition string. More...
 
const clang::RecordDecl * ROOT::TMetaUtils::AST2SourceTools::EncloseInScopes (const clang::Decl &decl, std::string &defString)
 Take the scopes which enclose the decl and put them around the definition string. More...
 
bool ROOT::TMetaUtils::EndsWith (const std::string &theString, const std::string &theSubstring)
 
void ROOT::TMetaUtils::Error (const char *location, const char *va_(fmt),...)
 
bool ROOT::TMetaUtils::ExtractAttrIntPropertyFromName (const clang::Decl &decl, const std::string &propName, int &propValue)
 This routine counts on the "propName<separator>propValue" format. More...
 
bool ROOT::TMetaUtils::ExtractAttrPropertyFromName (const clang::Decl &decl, const std::string &propName, std::string &propValue)
 This routine counts on the "propName<separator>propValue" format. More...
 
int ROOT::TMetaUtils::extractAttrString (clang::Attr *attribute, std::string &attrString)
 Extract attr string. More...
 
void ROOT::TMetaUtils::ExtractCtxtEnclosingNameSpaces (const clang::DeclContext &, std::list< std::pair< std::string, bool > > &)
 Extract enclosing namespaces recusrively. More...
 
void ROOT::TMetaUtils::ExtractEnclosingNameSpaces (const clang::Decl &, std::list< std::pair< std::string, bool > > &)
 Extract the immediately outer namespace and then launch the recursion. More...
 
const clang::RecordDecl * ROOT::TMetaUtils::ExtractEnclosingScopes (const clang::Decl &decl, std::list< std::pair< std::string, unsigned int > > &enclosingSc)
 Extract the names and types of containing scopes. More...
 
int ROOT::TMetaUtils::extractPropertyNameVal (clang::Attr *attribute, std::string &attrName, std::string &attrValue)
 
int ROOT::TMetaUtils::extractPropertyNameValFromString (const std::string attributeStr, std::string &attrName, std::string &attrValue)
 
clang::TemplateName ROOT::TMetaUtils::ExtractTemplateNameFromQualType (const clang::QualType &qt)
 These manipulations are necessary because a template specialisation type does not inherit from a record type (there is an asymmetry between the decls and the types in the clang interface). More...
 
void ROOT::TMetaUtils::Fatal (const char *location, const char *va_(fmt),...)
 
int ROOT::TMetaUtils::AST2SourceTools::FwdDeclFromFcnDecl (const clang::FunctionDecl &fcnDecl, const cling::Interpreter &interpreter, std::string &defString)
 
int ROOT::TMetaUtils::AST2SourceTools::FwdDeclFromRcdDecl (const clang::RecordDecl &recordDecl, const cling::Interpreter &interpreter, std::string &defString, bool acceptStl=false)
 Convert a rcd decl to its fwd decl If this is a template specialisation, treat in the proper way. More...
 
int ROOT::TMetaUtils::AST2SourceTools::FwdDeclFromTmplDecl (const clang::TemplateDecl &tmplDecl, const cling::Interpreter &interpreter, std::string &defString)
 Convert a tmplt decl to its fwd decl. More...
 
int ROOT::TMetaUtils::AST2SourceTools::FwdDeclFromTypeDefNameDecl (const clang::TypedefNameDecl &tdnDecl, const cling::Interpreter &interpreter, std::string &fwdDeclString, std::unordered_set< std::string > *fwdDeclSet=nullptr)
 Extract "forward declaration" of a typedef. More...
 
template<typename T >
const T * ROOT::TMetaUtils::GetAnnotatedRedeclarable (const T *Redecl)
 
const clang::TypedefNameDecl * ROOT::TMetaUtils::GetAnnotatedRedeclarable (const clang::TypedefNameDecl *TND)
 
const clang::TagDecl * ROOT::TMetaUtils::GetAnnotatedRedeclarable (const clang::TagDecl *TND)
 
llvm::StringRef ROOT::TMetaUtils::GetClassComment (const clang::CXXRecordDecl &decl, clang::SourceLocation *loc, const cling::Interpreter &interpreter)
 Return the class comment after the ClassDef: class MyClass { ... More...
 
int ROOT::TMetaUtils::GetClassVersion (const clang::RecordDecl *cl, const cling::Interpreter &interp)
 Return the version number of the class or -1 if the function Class_Version does not exist. More...
 
llvm::StringRef ROOT::TMetaUtils::GetComment (const clang::Decl &decl, clang::SourceLocation *loc=0)
 Returns the comment (// striped away), annotating declaration in a meaningful for ROOT IO way. More...
 
void ROOT::TMetaUtils::GetCppName (std::string &output, const char *input)
 Return (in the argument 'output') a mangled version of the C++ symbol/type (pass as 'input') that can be used in C++ as a variable name. More...
 
int ROOT::TMetaUtils::AST2SourceTools::GetDefArg (const clang::ParmVarDecl &par, std::string &valAsString, const clang::PrintingPolicy &pp)
 Get the default value as string. More...
 
int & ROOT::TMetaUtils::GetErrorIgnoreLevel ()
 
llvm::StringRef ROOT::TMetaUtils::GetFileName (const clang::Decl &decl, const cling::Interpreter &interp)
 Return the header file to be included to declare the Decl. More...
 
void ROOT::TMetaUtils::GetFullyQualifiedTypeName (std::string &name, const clang::QualType &type, const cling::Interpreter &interpreter)
 
void ROOT::TMetaUtils::GetFullyQualifiedTypeName (std::string &name, const clang::QualType &type, const clang::ASTContext &)
 
const clang::FunctionDecl * ROOT::TMetaUtils::GetFuncWithProto (const clang::Decl *cinfo, const char *method, const char *proto, const cling::Interpreter &gInterp, bool diagnose)
 
std::string ROOT::TMetaUtils::GetInterpreterExtraIncludePath (bool rootbuild)
 Return the -I needed to find RuntimeUniverse.h. More...
 
long ROOT::TMetaUtils::GetLineNumber (clang::Decl const *)
 
std::string ROOT::TMetaUtils::GetLLVMResourceDir (bool rootbuild)
 Return the LLVM / clang resource directory. More...
 
std::string ROOT::TMetaUtils::GetModuleFileName (const char *moduleName)
 Return the dictionary file name for a module. More...
 
std::pair< std::string, clang::QualType > ROOT::TMetaUtils::GetNameTypeForIO (const clang::QualType &templateInstanceType, const cling::Interpreter &interpreter, const TNormalizedCtxt &normCtxt, TClassEdit::EModType mode=TClassEdit::kNone)
 
bool ROOT::TMetaUtils::GetNameWithinNamespace (std::string &, std::string &, std::string &, clang::CXXRecordDecl const *)
 
void ROOT::TMetaUtils::GetNormalizedName (std::string &norm_name, const clang::QualType &type, const cling::Interpreter &interpreter, const TNormalizedCtxt &normCtxt)
 Return the type name normalized for ROOT, keeping only the ROOT opaque typedef (Double32_t, etc.) and adding default template argument for all types except the STL collections where we remove the default template argument if any. More...
 
void ROOT::TMetaUtils::GetNormalizedName (std::string &norm_name, const clang::TypeDecl *typeDecl, const cling::Interpreter &interpreter)
 
clang::QualType ROOT::TMetaUtils::GetNormalizedType (const clang::QualType &type, const cling::Interpreter &interpreter, const TNormalizedCtxt &normCtxt)
 Return the type normalized for ROOT, keeping only the ROOT opaque typedef (Double32_t, etc.) and adding default template argument for all types except those explicitly requested to be drop by the user. More...
 
unsigned int & ROOT::TMetaUtils::GetNumberOfWarningsAndErrors ()
 
const std::string & ROOT::TMetaUtils::GetPathSeparator ()
 Return the separator suitable for this platform. More...
 
void ROOT::TMetaUtils::GetQualifiedName (std::string &qual_name, const clang::QualType &type, const clang::NamedDecl &forcontext)
 Main implementation relying on GetFullyQualifiedTypeName All other GetQualifiedName functions leverage this one except the one for namespaces. More...
 
std::string ROOT::TMetaUtils::GetQualifiedName (const clang::QualType &type, const clang::NamedDecl &forcontext)
 
void ROOT::TMetaUtils::GetQualifiedName (std::string &qual_name, const clang::Type &type, const clang::NamedDecl &forcontext)
 
std::string ROOT::TMetaUtils::GetQualifiedName (const clang::Type &type, const clang::NamedDecl &forcontext)
 
void ROOT::TMetaUtils::GetQualifiedName (std::string &qual_name, const clang::NamedDecl &nd)
 This implementation does not rely on GetFullyQualifiedTypeName. More...
 
std::string ROOT::TMetaUtils::GetQualifiedName (const clang::NamedDecl &nd)
 
void ROOT::TMetaUtils::GetQualifiedName (std::string &qual_name, const AnnotatedRecordDecl &annotated)
 
std::string ROOT::TMetaUtils::GetQualifiedName (const AnnotatedRecordDecl &annotated)
 
void ROOT::TMetaUtils::GetQualifiedName (std::string &qual_name, const clang::RecordDecl &recordDecl)
 
std::string ROOT::TMetaUtils::GetQualifiedName (const clang::RecordDecl &recordDecl)
 
std::string ROOT::TMetaUtils::GetROOTIncludeDir (bool rootbuild)
 
clang::QualType ROOT::TMetaUtils::GetTypeForIO (const clang::QualType &templateInstanceType, const cling::Interpreter &interpreter, const TNormalizedCtxt &normCtxt, TClassEdit::EModType mode=TClassEdit::kNone)
 
clang::RecordDecl * ROOT::TMetaUtils::GetUnderlyingRecordDecl (clang::QualType type)
 
const clang::Type * ROOT::TMetaUtils::GetUnderlyingType (clang::QualType type)
 Return the base/underlying type of a chain of array or pointers type. More...
 
bool ROOT::TMetaUtils::HasCustomConvStreamerMemberFunction (const AnnotatedRecordDecl &cl, const clang::CXXRecordDecl *clxx, const cling::Interpreter &interp, const TNormalizedCtxt &normCtxt)
 Return true if the class has a custom member function streamer. More...
 
bool ROOT::TMetaUtils::HasCustomOperatorNewArrayPlacement (clang::RecordDecl const &, const cling::Interpreter &interp)
 
bool ROOT::TMetaUtils::HasCustomOperatorNewPlacement (char const *, clang::RecordDecl const &, const cling::Interpreter &)
 
bool ROOT::TMetaUtils::HasCustomOperatorNewPlacement (clang::RecordDecl const &, const cling::Interpreter &)
 
bool ROOT::TMetaUtils::HasCustomStreamerMemberFunction (const AnnotatedRecordDecl &cl, const clang::CXXRecordDecl *clxx, const cling::Interpreter &interp, const TNormalizedCtxt &normCtxt)
 Return true if the class has a custom member function streamer. More...
 
bool ROOT::TMetaUtils::HasDirectoryAutoAdd (clang::CXXRecordDecl const *, const cling::Interpreter &)
 
bool ROOT::TMetaUtils::HasIOConstructor (clang::CXXRecordDecl const *, std::string &, const RConstructorTypes &, const cling::Interpreter &)
 
bool ROOT::TMetaUtils::HasNewMerge (clang::CXXRecordDecl const *, const cling::Interpreter &)
 
bool ROOT::TMetaUtils::HasOldMerge (clang::CXXRecordDecl const *, const cling::Interpreter &)
 
bool ROOT::TMetaUtils::hasOpaqueTypedef (clang::QualType instanceType, const TNormalizedCtxt &normCtxt)
 Return true if the type is a Double32_t or Float16_t or is a instance template that depends on Double32_t or Float16_t. More...
 
bool ROOT::TMetaUtils::hasOpaqueTypedef (const AnnotatedRecordDecl &cl, const cling::Interpreter &interp, const TNormalizedCtxt &normCtxt)
 Return true if any of the argument is or contains a double32. More...
 
bool ROOT::TMetaUtils::HasResetAfterMerge (clang::CXXRecordDecl const *, const cling::Interpreter &)
 
void ROOT::TMetaUtils::Info (const char *location, const char *va_(fmt),...)
 
static const std::string ROOT::TMetaUtils::propNames::ioname ("ioname")
 
static const std::string ROOT::TMetaUtils::propNames::iotype ("iotype")
 
bool ROOT::TMetaUtils::IsBase (const clang::CXXRecordDecl *cl, const clang::CXXRecordDecl *base, const clang::CXXRecordDecl *context, const cling::Interpreter &interp)
 
bool ROOT::TMetaUtils::IsBase (const clang::FieldDecl &m, const char *basename, const cling::Interpreter &interp)
 
bool ROOT::TMetaUtils::IsOfType (const clang::CXXRecordDecl &cl, const std::string &type, const cling::LookupHelper &lh)
 
bool ROOT::TMetaUtils::IsStdClass (const clang::RecordDecl &cl)
 Return true, if the decl is part of the std namespace. More...
 
bool ROOT::TMetaUtils::IsStdDropDefaultClass (const clang::RecordDecl &cl)
 Return true, if the decl is part of the std namespace and we want its default parameter dropped. More...
 
ROOT::ESTLType ROOT::TMetaUtils::IsSTLCont (const clang::RecordDecl &cl)
 type : type name: vector<list<classA,allocator>,allocator> result: 0 : not stl container abs(result): code of container 1=vector,2=list,3=deque,4=map 5=multimap,6=set,7=multiset More...
 
int ROOT::TMetaUtils::IsSTLContainer (const AnnotatedRecordDecl &annotated)
 Is this an STL container. More...
 
ROOT::ESTLType ROOT::TMetaUtils::IsSTLContainer (const clang::FieldDecl &m)
 Is this an STL container? More...
 
int ROOT::TMetaUtils::IsSTLContainer (const clang::CXXBaseSpecifier &base)
 Is this an STL container? More...
 
bool ROOT::TMetaUtils::IsStreamableObject (const clang::FieldDecl &m, const cling::Interpreter &interp)
 
void ROOT::TMetaUtils::LevelPrint (bool prefix, int level, const char *location, const char *fmt, va_list ap)
 
bool ROOT::TMetaUtils::MatchWithDeclOrAnyOfPrevious (const clang::CXXRecordDecl &cl, const clang::CXXRecordDecl &currentCl)
 This is a recursive function. More...
 
static const std::string ROOT::TMetaUtils::propNames::name ("name")
 
static const std::string ROOT::TMetaUtils::propNames::nArgsToKeep ("nArgsToKeep")
 
bool ROOT::TMetaUtils::NeedDestructor (clang::CXXRecordDecl const *)
 
bool ROOT::TMetaUtils::NeedTemplateKeyword (clang::CXXRecordDecl const *)
 
static const std::string ROOT::TMetaUtils::propNames::pattern ("pattern")
 
static const std::string ROOT::TMetaUtils::propNames::persistent ("persistent")
 
int ROOT::TMetaUtils::AST2SourceTools::PrepareArgsForFwdDecl (std::string &templateArgs, const clang::TemplateParameterList &tmplParamList, const cling::Interpreter &interpreter)
 Loop over the template parameters and build a string for template arguments using the fully qualified name There are different cases: Case 1: a simple template parameter E.g. More...
 
clang::ClassTemplateDecl * ROOT::TMetaUtils::QualType2ClassTemplateDecl (const clang::QualType &qt)
 Extract from a qualtype the class template if this makes sense. More...
 
bool ROOT::TMetaUtils::QualType2Template (const clang::QualType &qt, clang::ClassTemplateDecl *&ctd, clang::ClassTemplateSpecializationDecl *&ctsd)
 Get the template specialisation decl and template decl behind the qualtype Returns true if successfully found, false otherwise. More...
 
int ROOT::TMetaUtils::RemoveTemplateArgsFromName (std::string &name, unsigned int)
 Remove the last n template arguments from the name. More...
 
void ROOT::TMetaUtils::ReplaceAll (std::string &str, const std::string &from, const std::string &to, bool recurse=false)
 
bool ROOT::TMetaUtils::RequireCompleteType (const cling::Interpreter &interp, const clang::CXXRecordDecl *cl)
 
bool ROOT::TMetaUtils::RequireCompleteType (const cling::Interpreter &interp, clang::SourceLocation Loc, clang::QualType Type)
 
clang::QualType ROOT::TMetaUtils::ReSubstTemplateArg (clang::QualType input, const clang::Type *instance)
 Check if 'input' or any of its template parameter was substituted when instantiating the class template instance and replace it with the partially sugared types we have from 'instance'. More...
 
const clang::CXXRecordDecl * ROOT::TMetaUtils::ScopeSearch (const char *name, const cling::Interpreter &gInterp, bool diagnose, const clang::Type **resultType)
 Return the scope corresponding to 'name' or std::'name'. More...
 
static const std::string ROOT::TMetaUtils::propNames::separator ("@@@")
 
void ROOT::TMetaUtils::SetPathsForRelocatability (std::vector< std::string > &clingArgs)
 Organise the parameters for cling in order to guarantee relocatability It treats the gcc toolchain and the root include path FIXME: enables relocatability for experiments' framework headers until PCMs are available. More...
 
const char * ROOT::TMetaUtils::ShortTypeName (const char *typeDesc)
 Return the absolute type of typeDesc. More...
 
std::string ROOT::TMetaUtils::ShortTypeName (const clang::FieldDecl &m)
 Return the absolute type of typeDesc. More...
 
ROOT::ESTLType ROOT::TMetaUtils::STLKind (const llvm::StringRef type)
 Converts STL container name to number. vector -> 1, etc.. More...
 
void ROOT::TMetaUtils::SysError (const char *location, const char *va_(fmt),...)
 
static const std::string ROOT::TMetaUtils::propNames::transient ("transient")
 
std::string ROOT::TMetaUtils::TrueName (const clang::FieldDecl &m)
 TrueName strips the typedefs and array dimensions. More...
 
void ROOT::TMetaUtils::Warning (const char *location, const char *va_(fmt),...)
 
void ROOT::TMetaUtils::WriteAuxFunctions (std::ostream &finalString, const AnnotatedRecordDecl &cl, const clang::CXXRecordDecl *decl, const cling::Interpreter &interp, const RConstructorTypes &ctorTypes, const TNormalizedCtxt &normCtxt)
 std::string NormalizedName; GetNormalizedName(NormalizedName, decl->getASTContext().getTypeDeclType(decl), interp, normCtxt); More...
 
void ROOT::TMetaUtils::WriteClassCode (CallWriteStreamer_t WriteStreamerFunc, const AnnotatedRecordDecl &cl, const cling::Interpreter &interp, const TNormalizedCtxt &normCtxt, std::ostream &finalString, const RConstructorTypes &ctorTypes, bool isGenreflex)
 Generate the code of the class If the requestor is genreflex, request the new streamer format. More...
 
void ROOT::TMetaUtils::WriteClassInit (std::ostream &finalString, const AnnotatedRecordDecl &cl, const clang::CXXRecordDecl *decl, const cling::Interpreter &interp, const TNormalizedCtxt &normCtxt, const RConstructorTypes &ctorTypes, bool &needCollectionProxy)
 FIXME: a function of ~300 lines! More...
 
int ROOT::TMetaUtils::WriteNamespaceHeader (std::ostream &, const clang::RecordDecl *)
 
int ROOT::TMetaUtils::WriteNamespaceHeader (std::ostream &, const clang::DeclContext *)
 Write all the necessary opening part of the namespace and return the number of closing brackets needed For example for Space1::Space2 we write: namespace Space1 { namespace Space2 { and return 2. More...
 
void ROOT::TMetaUtils::WritePointersSTL (const AnnotatedRecordDecl &cl, const cling::Interpreter &interp, const TNormalizedCtxt &normCtxt)
 Write interface function for STL members. More...
 

Variables

const int ROOT::TMetaUtils::kError = 2000
 
const int ROOT::TMetaUtils::kFatal = 4000
 
const int ROOT::TMetaUtils::kInfo = 0
 
const int ROOT::TMetaUtils::kMaxLen = 1024
 
const int ROOT::TMetaUtils::kNote = 500
 
const int ROOT::TMetaUtils::kSysError = 3000
 
const int ROOT::TMetaUtils::kThrowOnWarning = 999
 
const int ROOT::TMetaUtils::kWarning = 1000