📄 main.cxx
字号:
PObject::Comparison TypeBase::Compare(const PObject & obj) const{ return name.Compare(((const TypeBase &)obj).name);}void TypeBase::PrintOn(ostream & strm) const{ PrintStart(strm); PrintFinish(strm);}void TypeBase::PrintStart(ostream & strm) const{ strm << indent(); if (!name) { strm << name; if (!parameters.IsEmpty()) { strm << " { "; for (PINDEX i = 0; i < parameters.GetSize(); i++) { if (i > 0) strm << ", "; strm << parameters[i]; } strm << " } "; } strm << ": "; } strm << tag << GetClass() << ' '; Module->SetIndentLevel(1);}void TypeBase::PrintFinish(ostream & strm) const{ Module->SetIndentLevel(-1); strm << ' ' << constraints; if (isOptional) strm << " OPTIONAL"; if (defaultValue != NULL) strm << " DEFAULT " << *defaultValue; strm << '\n';}int TypeBase::GetIdentifierTokenContext() const{ return IDENTIFIER;}int TypeBase::GetBraceTokenContext() const{ return '{';}void TypeBase::SetName(PString * newName){ name = *newName; delete newName; identifier = MakeIdentifierC(name);}void TypeBase::AdjustIdentifier(){ identifier = Module->GetPrefix() + MakeIdentifierC(name);}void TypeBase::SetTag(Tag::Type type, unsigned num, Tag::Mode mode){ tag.type = type; tag.number = num; tag.mode = mode;}void TypeBase::SetParameters(PStringList * list){ parameters = *list; delete list;}void TypeBase::MoveConstraints(TypeBase * from){ from->constraints.DisallowDeleteObjects(); while (!from->constraints.IsEmpty()) constraints.Append(from->constraints.RemoveAt(0)); from->constraints.AllowDeleteObjects();}void TypeBase::FlattenUsedTypes(){}TypeBase * TypeBase::FlattenThisType(const TypeBase &){ return this;}BOOL TypeBase::IsChoice() const{ return FALSE;}BOOL TypeBase::IsParameterizedType() const{ return FALSE;}BOOL TypeBase::IsPrimitiveType() const{ return TRUE;}void TypeBase::GenerateCplusplus(ostream & hdr, ostream & cxx){ BeginGenerateCplusplus(hdr, cxx); // Close off the constructor implementation cxx << ")\n" "{\n"; GenerateCplusplusConstraints(PString(), hdr, cxx); EndGenerateCplusplus(hdr, cxx);}void TypeBase::GenerateForwardDecls(ostream &){}void TypeBase::GenerateOperators(ostream &, ostream &, const TypeBase &){}PString TypeBase::GetTypeName() const{ return GetAncestorClass();}BOOL TypeBase::CanReferenceType() const{ return FALSE;}BOOL TypeBase::ReferencesType(const TypeBase &){ return FALSE;}void TypeBase::SetImportPrefix(const PString &){}BOOL TypeBase::IsParameterisedImport() const{ return FALSE;}void TypeBase::BeginGenerateCplusplus(ostream & hdr, ostream & cxx){ classNameString = GetIdentifier(); if (!parameters.IsEmpty()) { templatePrefix = "template <"; classNameString += '<'; for (PINDEX i = 0; i < parameters.GetSize(); i++) { if (i > 0) { templatePrefix += ", "; classNameString += ", "; } PString ident = MakeIdentifierC(parameters[i]); templatePrefix += "class " + ident; classNameString += ident; } templatePrefix += ">\n"; classNameString += '>'; } // Output header file declaration of class hdr << "//\n" "// " << GetName() << "\n" "//\n" "\n"; GenerateForwardDecls(hdr); hdr << templatePrefix << "class " << GetIdentifier() << " : public " << GetTypeName() << "\n" "{\n" "#ifndef PASN_LEANANDMEAN\n" " PCLASSINFO(" << GetIdentifier() << ", " << GetTypeName() << ");\n" "#endif\n" " public:\n" " " << GetIdentifier() << "(unsigned tag = "; if (tag.type == Tag::Universal && tag.number < PARRAYSIZE(UniversalTagNames) && UniversalTagNames[tag.number] != NULL) hdr << UniversalTagNames[tag.number]; else hdr << tag.number; hdr << ", TagClass tagClass = " << UniversalTagClassNames[tag.type] << ");\n\n"; App & app = (App &)PProcess::Current(); app.OutputAdditionalHeaders(hdr, GetIdentifier()); // Output cxx file implementation of class cxx << "//\n" "// " << GetName() << "\n" "//\n" "\n" << GetTemplatePrefix() << GetClassNameString() << "::" << GetIdentifier() << "(unsigned tag, PASN_Object::TagClass tagClass)\n" " : " << GetTypeName() << "(tag, tagClass";}void TypeBase::EndGenerateCplusplus(ostream & hdr, ostream & cxx){ cxx << "}\n" "\n" "\n"; GenerateOperators(hdr, cxx, *this); // Output header file declaration of class hdr << " PObject * Clone() const;\n" "};\n" "\n" "\n"; // Output cxx file implementation of class cxx << GetTemplatePrefix() << "PObject * " << GetClassNameString() << "::Clone() const\n" "{\n" "#ifndef PASN_LEANANDMEAN\n" " PAssert(IsClass(" << GetClassNameString() << "::Class()), PInvalidCast);\n" "#endif\n" " return new " << GetClassNameString() << "(*this);\n" "}\n" "\n" "\n"; isGenerated = TRUE;}void TypeBase::GenerateCplusplusConstructor(ostream &, ostream & cxx){ cxx << '('; if (HasNonStandardTag()) { if (tag.type == Tag::Universal && tag.number < PARRAYSIZE(UniversalTagNames) && UniversalTagNames[tag.number] != NULL) cxx << UniversalTagNames[tag.number]; else cxx << tag.number; cxx << ", " << UniversalTagClassNames[tag.type]; } cxx << ')';}void TypeBase::GenerateCplusplusConstraints(const PString & prefix, ostream & hdr, ostream & cxx){ for (PINDEX i = 0; i < constraints.GetSize(); i++) constraints[i].GenerateCplusplus(" " + prefix + "SetConstraints(", hdr, cxx);}/////////////////////////////////////////////////////////DefinedType::DefinedType(PString * name, BOOL parameter) : TypeBase(Tag::IllegalUniversalTag), referenceName(*name){ delete name; baseType = NULL; unresolved = !parameter;}DefinedType::DefinedType(TypeBase * refType, TypeBase * bType) : TypeBase(refType), referenceName(bType->GetName()){ MoveConstraints(refType); baseType = bType; unresolved = FALSE;}DefinedType::DefinedType(TypeBase * refType, const PString & refName) : TypeBase(refType){ MoveConstraints(refType); ConstructFromType(refType, refName);}DefinedType::DefinedType(TypeBase * refType, const TypeBase & parent) : TypeBase(refType){ if (!name) ConstructFromType(refType, parent.GetName() + '_' + name); else ConstructFromType(refType, parent.GetName() + "_subtype");}void DefinedType::ConstructFromType(TypeBase * refType, const PString & name){ referenceName = name; refType->SetName(new PString(name)); Module->AppendType(refType); baseType = refType; unresolved = FALSE;}void DefinedType::PrintOn(ostream & strm) const{ PrintStart(strm); strm << referenceName << ' '; PrintFinish(strm);}BOOL DefinedType::CanReferenceType() const{ return TRUE;}BOOL DefinedType::IsChoice() const{ if (baseType != NULL) return baseType->IsChoice(); return FALSE;}BOOL DefinedType::IsParameterizedType() const{ if (baseType != NULL) return baseType->IsParameterizedType(); return FALSE;}BOOL DefinedType::ReferencesType(const TypeBase & type){ if (unresolved) { unresolved = FALSE; if ((baseType = Module->FindType(referenceName)) == NULL) PError << StdError(Warning) << "unresolved symbol: " << referenceName << endl; else { if (!HasNonStandardTag()) defaultTag = tag = baseType->GetTag(); } } return type.GetName() == referenceName;}void DefinedType::GenerateOperators(ostream & hdr, ostream & cxx, const TypeBase & actualType){ if (baseType != NULL) baseType->GenerateOperators(hdr, cxx, actualType);}const char * DefinedType::GetAncestorClass() const{ if (baseType != NULL) return baseType->GetAncestorClass(); return NULL;}PString DefinedType::GetTypeName() const{ if (baseType == NULL) return referenceName; if (HasConstraints() && baseType->IsPrimitiveType()) return baseType->GetTypeName(); return baseType->GetIdentifier();}/////////////////////////////////////////////////////////ParameterizedType::ParameterizedType(PString * name, TypesList * args) : DefinedType(name, FALSE), arguments(*args){ delete args;}void ParameterizedType::PrintOn(ostream & strm) const{ PrintStart(strm); strm << referenceName << " { "; for (PINDEX i = 0; i < arguments.GetSize(); i++) { if (i > 0) strm << ", "; strm << arguments[i].GetTypeName(); } strm << " }"; PrintFinish(strm);}BOOL ParameterizedType::IsParameterizedType() const{ return TRUE;}BOOL ParameterizedType::ReferencesType(const TypeBase & type){ for (PINDEX i = 0; i < arguments.GetSize(); i++) { if (arguments[i].ReferencesType(type)) return TRUE; } return DefinedType::ReferencesType(type);}PString ParameterizedType::GetTypeName() const{ PString typeName = DefinedType::GetTypeName(); if (!arguments.IsEmpty()) { typeName += '<'; for (PINDEX i = 0; i < arguments.GetSize(); i++) { if (i > 0) typeName += ", "; typeName += arguments[i].GetTypeName(); } typeName += '>'; } return typeName;}/////////////////////////////////////////////////////////SelectionType::SelectionType(PString * name, TypeBase * base) : TypeBase(Tag::IllegalUniversalTag), selection(*name){ delete name; baseType = PAssertNULL(base);}SelectionType::~SelectionType(){ delete baseType;}void SelectionType::PrintOn(ostream & strm) const{ PrintStart(strm); strm << selection << '<' << *baseType; PrintFinish(strm);}void SelectionType::FlattenUsedTypes(){ baseType = baseType->FlattenThisType(*this);}TypeBase * SelectionType::FlattenThisType(const TypeBase & parent){ return new DefinedType(this, parent);}void SelectionType::GenerateCplusplus(ostream &, ostream &){ PError << StdError(Fatal) << "Cannot generate code for Selection type" << endl; isGenerated = TRUE;}const char * SelectionType::GetAncestorClass() const{ return "";}BOOL SelectionType::CanReferenceType() const{ return TRUE;}BOOL SelectionType::ReferencesType(const TypeBase & type){ return baseType->ReferencesType(type);}/////////////////////////////////////////////////////////BooleanType::BooleanType() : TypeBase(Tag::UniversalBoolean)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -