Refactor ICG

Hey buddy. I wanted to tell you this before you heard it from someone
else...

I refactored ICG.

Now, it's gonna look a little scary at first. But I promise you'll like
it when you get used to it. It'll be fine. You can trust me. #341
This commit is contained in:
Derek Bankieris 2016-10-28 14:37:12 -05:00
parent ba75f6ff37
commit ef1405c3be
22 changed files with 365 additions and 1009 deletions

View File

@ -175,10 +175,6 @@ void ClassValues::clearAmbiguousVariables() {
}
std::vector<FieldDescription *> ClassValues::getFieldDescription() {
return field_descripts ;
}
void ClassValues::clearFieldDescription() {
field_descripts.clear() ;
}
@ -239,20 +235,6 @@ bool ClassValues::getHasPublicDestructor() {
return has_public_destructor ;
}
std::string ClassValues::getFullyQualifiedTypeName() {
std::ostringstream oss ;
NamespaceIterator ni ;
for ( ni = namespace_begin() ; ni != namespace_end() ; ni++ ) {
oss << (*ni) << "::" ;
}
for ( ni = container_class_begin() ; ni != container_class_end() ; ni++ ) {
oss << (*ni) << "::" ;
}
oss << name ;
return oss.str() ;
}
void ClassValues::setMangledTypeName( std::string in_val ) {
mangled_type_name = in_val ;
}
@ -264,20 +246,23 @@ std::string ClassValues::getMangledTypeName() {
return mangled_type_name ;
}
std::string ClassValues::getFullyQualifiedMangledTypeName() {
std::string ClassValues::getFullyQualifiedMangledTypeName(const std::string& delimiter) {
std::ostringstream oss ;
NamespaceIterator ni ;
for ( ni = namespace_begin() ; ni != namespace_end() ; ni++ ) {
oss << (*ni) << "::" ;
}
for ( ni = container_class_begin() ; ni != container_class_end() ; ni++ ) {
oss << (*ni) << "::" ;
}
printNamespacesAndContainerClasses(oss, delimiter) ;
oss << getMangledTypeName() ;
return oss.str() ;
}
std::string ClassValues::getFullyQualifiedNameIfEqual() {
std::string result;
if (getName() == getMangledTypeName()) {
result += getNamespacesAndContainerClasses();
}
result += getName();
return result;
}
void ClassValues::setCompat15(bool in_val) {
compat15 = in_val ;
}
@ -286,38 +271,6 @@ bool ClassValues::isCompat15() {
return compat15 ;
}
void ClassValues::print_namespaces(std::ostream & os, const char * delimiter) {
unsigned int ii ;
for ( ii = 0 ; ii < namespaces.size() ; ii++ ) {
os << namespaces[ii] << delimiter ;
}
}
std::ostream & operator << (std::ostream & os , ClassValues & cv ) {
os << " name = " << cv.name << std::endl ;
os << " mangled_name = " << cv.mangled_type_name << std::endl ;
os << " file_name = " << cv.file_name << std::endl ;
os << " namespaces =" ;
ConstructValues::NamespaceIterator it ;
for ( it = cv.namespace_begin() ; it != cv.namespace_end() ; it++ ) {
os << " " << *it ;
}
os << std::endl ;
os << " parent classes =" ;
for ( it = cv.container_class_begin() ; it != cv.container_class_end() ; it++ ) {
os << " " << *it ;
}
os << std::endl ;
os << " has_init_attr_friend = " << cv.has_init_attr_friend << std::endl ;
os << " is_pod = " << cv.is_pod << std::endl ;
os << " is_abstract = " << cv.is_abstract << std::endl ;
os << " has_default_constructor = " << cv.has_default_constructor << std::endl ;
os << " has_public_destructor = " << cv.has_public_destructor << std::endl ;
ClassValues::FieldIterator fit ;
for ( fit = cv.field_begin() ; fit != cv.field_end() ; fit++ ) {
os << **fit << std::endl ;
}
return os ;
bool ClassValues::isInStandardNamespace() {
return namespaces.size() && !namespaces[0].compare("std");
}

View File

@ -40,28 +40,26 @@ class ClassValues : public ConstructValues {
unsigned int class_offset, bool virtual_inherited) ;
/** Gets the list of fields in this class */
std::vector<FieldDescription *> getFieldDescription() ;
const std::vector<FieldDescription*>& getFieldDescriptions() {
return field_descripts ;
}
void clearFieldDescription() ;
typedef std::vector< FieldDescription * >::iterator FieldIterator ;
FieldIterator field_begin() { return field_descripts.begin() ; } ;
FieldIterator field_end() { return field_descripts.end() ; } ;
/** Appends an inherited class name to the list this class inherits from */
void addInheritedClass( std::string class_name ) ;
/** Gets the list of inherited classes */
const std::vector<std::string>& getInheritedClasses() {
return inherited_classes ;
}
void saveInheritAncestry( ClassValues * in_cv ) ;
void setContainerClassForFields() ;
void clearAmbiguousVariables() ;
void clearInheritedClass() ;
typedef std::vector< std::string >::iterator InheritedClassesIterator ;
InheritedClassesIterator inherit_classes_begin() { return inherited_classes.begin() ; } ;
InheritedClassesIterator inherit_classes_end() { return inherited_classes.end() ; } ;
unsigned int getNumInheritedClasses() { return inherited_classes.size() ; } ;
void setVirtualInherited(bool in_inh) ;
bool isVirtualInherited() ;
void setHasInitAttrFriend(bool in_val) ;
@ -76,19 +74,15 @@ class ClassValues : public ConstructValues {
bool getHasDefaultConstructor() ;
void setHasPublicDestructor(bool in_val) ;
bool getHasPublicDestructor() ;
std::string getFullyQualifiedTypeName() ;
void setMangledTypeName( std::string in_val ) ;
std::string getMangledTypeName() ;
std::string getFullyQualifiedMangledTypeName() ;
std::string getFullyQualifiedMangledTypeName(const std::string& delimiter = "::") ;
std::string getFullyQualifiedNameIfEqual();
void setCompat15(bool in_val) ;
bool isCompat15() ;
void print_namespaces(std::ostream & os, const char * delimiter) ;
friend std::ostream & operator << (std::ostream & os , ClassValues & cv ) ;
bool isInStandardNamespace();
private:
/** List of fields (data members) contained in the class */
std::vector< FieldDescription * > field_descripts ;
std::map< std::string , FieldDescription * > field_name_to_info_map ;

View File

@ -209,7 +209,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) {
//std::cout << " " << getFileName(ci , rd->getSourceRange().getEnd(), hsd) << "" << std::endl ;
CXXRecordVisitor inherit_cvis(ci , cs, hsd , pa, false) ;
inherit_cvis.TraverseCXXRecordDecl(static_cast<clang::CXXRecordDecl *>(rd)) ;
cval.addInheritedFieldDescriptions(inherit_cvis.get_class_data()->getFieldDescription(),
cval.addInheritedFieldDescriptions(inherit_cvis.get_class_data()->getFieldDescriptions(),
inherit_class_offset, false) ;
// clear the field list in the inherited class so they are not freed when inherit_cvis
// goes out of scope.
@ -260,7 +260,7 @@ bool CXXRecordVisitor::VisitCXXRecordDecl( clang::CXXRecordDecl *rec ) {
//std::cout << " " << getFileName(ci , rd->getSourceRange().getEnd(), hsd) << "" << std::endl ;
CXXRecordVisitor inherit_cvis(ci , cs, hsd , pa, false) ;
inherit_cvis.TraverseCXXRecordDecl(static_cast<clang::CXXRecordDecl *>(rd)) ;
cval.addInheritedFieldDescriptions(inherit_cvis.get_class_data()->getFieldDescription(), inherit_class_offset, true) ;
cval.addInheritedFieldDescriptions(inherit_cvis.get_class_data()->getFieldDescriptions(), inherit_class_offset, true) ;
// clear the field list in the inherited class so they are not freed when inherit_cvis goes out of scope.
inherit_cvis.get_class_data()->clearFieldDescription() ;
// If we are inheriting from a template specialization, don't save the inherited class. This list
@ -300,7 +300,7 @@ bool CXXRecordVisitor::VisitFriendDecl( clang::FriendDecl *fd ) {
//nd->dump() ;
std::string init_func = std::string("init_attr") ;
std::stringstream name_sp ;
cval.print_namespaces( name_sp , "__") ;
cval.printNamespaces( name_sp , "__") ;
init_func += name_sp.str() + cval.getName() ;
std::string friend_str = nd->getName().str() ;
if ( ! friend_str.find(init_func) ) {

View File

@ -1,6 +1,7 @@
#include <iostream>
#include <sstream>
#include <clang/AST/DeclTemplate.h>
#include "ConstructValues.hh"
@ -39,7 +40,6 @@ void ConstructValues::getNamespacesAndClasses( const clang::DeclContext * Ctx )
for (ContextsTy::reverse_iterator I = Contexts.rbegin(), E = Contexts.rend(); I != E; ++I) {
if (const clang::NamespaceDecl *nd = clang::dyn_cast<clang::NamespaceDecl>(*I)) {
if (! nd->isAnonymousNamespace()) {
//std::cout << "namespace " << nd->getIdentifier()->getName().str() << std::endl ;
std::string temp_name = nd->getIdentifier()->getName().str() ;
if ( temp_name.compare("std") and temp_name.compare("__1")) {
addNamespace(nd->getIdentifier()->getName().str()) ;
@ -47,8 +47,23 @@ void ConstructValues::getNamespacesAndClasses( const clang::DeclContext * Ctx )
}
} else if (const clang::RecordDecl *rd = clang::dyn_cast<clang::RecordDecl>(*I)) {
if (rd->getIdentifier()) {
//std::cout << "in class " << rd->getName().str() << std::endl ;
addContainerClass(rd->getName().str()) ;
if (const clang::ClassTemplateSpecializationDecl *td = clang::dyn_cast<clang::ClassTemplateSpecializationDecl>(*I)) {
std::string text;
llvm::raw_string_ostream stream(text);
stream << td->getName().str() << "<";
const clang::TemplateArgumentList& arguments = td->getTemplateArgs();
unsigned end = arguments.size() - 1;
for (unsigned i = 0; i < end; ++i) {
arguments[i].print(printingPolicy, stream);
stream << ", ";
}
arguments[end].print(printingPolicy, stream);
stream << ">";
addContainerClass(stream.str());
}
else {
addContainerClass(rd->getName().str()) ;
}
}
}
}
@ -62,16 +77,57 @@ void ConstructValues::addContainerClass( std::string in_name ) {
container_classes.push_back(in_name) ;
}
std::string ConstructValues::getFullyQualifiedName() {
std::ostringstream oss ;
NamespaceIterator ni ;
std::string ConstructValues::getFullyQualifiedName(const std::string& delimiter) {
std::ostringstream oss;
printNamespaces(oss, delimiter);
printContainerClasses(oss, delimiter);
oss << name;
return oss.str();
}
for ( ni = namespace_begin() ; ni != namespace_end() ; ni++ ) {
oss << (*ni) << "::" ;
void ConstructValues::printOpenNamespaceBlocks(std::ostream& ostream) {
for (auto name : namespaces) {
ostream << "namespace " << name << " {" << std::endl;
}
for ( ni = container_class_begin() ; ni != container_class_end() ; ni++ ) {
oss << (*ni) << "::" ;
}
void ConstructValues::printCloseNamespaceBlocks(std::ostream& ostream) {
for (auto name : namespaces) {
ostream << "}" << std::endl;
}
}
void ConstructValues::printNamespaces(std::ostream& ostream, const std::string& delimiter) {
for (auto name : namespaces) {
ostream << name << delimiter;
}
}
void ConstructValues::printContainerClasses(std::ostream& ostream, const std::string& delimiter) {
for (auto clazz : container_classes) {
ostream << clazz << delimiter;
}
}
void ConstructValues::printNamespacesAndContainerClasses(std::ostream& ostream, const std::string& delimiter) {
printNamespaces(ostream, delimiter);
printContainerClasses(ostream, delimiter);
}
std::string ConstructValues::getNamespacesAndContainerClasses(const std::string& delimiter) {
std::string result = "";
for (auto name : namespaces) {
result += name + delimiter;
}
for (auto clazz : container_classes) {
result += clazz + delimiter;
}
return result;
}
std::string ConstructValues::getFullyQualifiedTypeName(const std::string& delimiter) {
std::ostringstream oss ;
printNamespacesAndContainerClasses(oss, delimiter) ;
oss << name ;
return oss.str() ;
}

View File

@ -7,6 +7,8 @@
#include <utility>
#include "clang/AST/Decl.h"
#include <clang/AST/PrettyPrinter.h>
#include <clang/Basic/LangOptions.h>
/**
@ -39,17 +41,26 @@ class ConstructValues {
void addNamespace(std::string in_name) ;
typedef std::vector< std::string >::iterator NamespaceIterator ;
NamespaceIterator namespace_begin() { return namespaces.begin() ; } ;
NamespaceIterator namespace_end() { return namespaces.end() ; } ;
const std::vector<std::string>& getNamespaces() {
return namespaces;
}
void addContainerClass(std::string in_name) ;
typedef std::vector< std::string >::iterator ContainerClassIterator ;
ContainerClassIterator container_class_begin() { return container_classes.begin() ; } ;
ContainerClassIterator container_class_end() { return container_classes.end() ; } ;
const std::vector<std::string>& getContainerClasses() {
return container_classes;
}
std::string getFullyQualifiedName() ;
std::string getFullyQualifiedName(const std::string& delimiter = "::") ;
void printOpenNamespaceBlocks(std::ostream& ostream);
void printCloseNamespaceBlocks(std::ostream& ostream);
void printNamespaces(std::ostream& ostream, const std::string& delimiter = "::") ;
void printContainerClasses(std::ostream& ostream, const std::string& delimiter = "::") ;
void printNamespacesAndContainerClasses(std::ostream& ostream, const std::string& delimiter = "::") ;
std::string getNamespacesAndContainerClasses(const std::string& delimiter = "::") ;
std::string getFullyQualifiedTypeName(const std::string& delimiter = "::") ;
protected:
@ -65,6 +76,8 @@ class ConstructValues {
/** File where construct is defined */
std::string file_name ;
const clang::PrintingPolicy printingPolicy = clang::PrintingPolicy(clang::LangOptions());
} ;
#endif

View File

@ -17,26 +17,3 @@ void EnumValues::setHasDefinition( bool in ) {
bool EnumValues::getHasDefinition() {
return has_definition ;
}
std::ostream & operator << (std::ostream & os , EnumValues & ev ) {
os << " name = " << ev.name << std::endl ;
os << " file_name = " << ev.file_name << std::endl ;
os << " namespaces =" ;
ConstructValues::NamespaceIterator it ;
for ( it = ev.namespace_begin() ; it != ev.namespace_end() ; it++ ) {
os << " " << *it ;
}
os << std::endl ;
os << " parent classes =" ;
for ( it = ev.container_class_begin() ; it != ev.container_class_end() ; it++ ) {
os << " " << *it ;
}
os << std::endl ;
EnumValues::NameValueIterator eit ;
for ( eit = ev.begin() ; eit != ev.end() ; eit++ ) {
os << " " << (*eit).first << " " << (*eit).second << std::endl ;
}
return os ;
}

View File

@ -32,15 +32,13 @@ class EnumValues : public ConstructValues {
void addEnum(std::string in_name , long long in_val) ;
typedef std::vector< NameValuePair >::iterator NameValueIterator ;
NameValueIterator begin() { return enum_values.begin() ; } ;
NameValueIterator end() { return enum_values.end() ; } ;
friend std::ostream & operator << (std::ostream & os , EnumValues & ev ) ;
void setHasDefinition( bool in ) ;
bool getHasDefinition() ;
const std::vector<NameValuePair>& getPairs() {
return enum_values;
}
private:
/** List of enums and their values */

View File

@ -375,6 +375,13 @@ std::string FieldDescription::getMangledTypeName() {
return mangled_type_name ;
}
std::string FieldDescription::getFullyQualifiedMangledTypeName(const std::string& delimiter) {
std::ostringstream oss ;
printNamespacesAndContainerClasses(oss, delimiter) ;
oss << getMangledTypeName() ;
return oss.str() ;
}
std::string FieldDescription::getUnits() {
return units ;
}
@ -517,43 +524,3 @@ int FieldDescription::getArrayDim(unsigned int dim_num) {
void FieldDescription::addArrayDim( int in_dim ) {
array_sizes[num_dims++] = in_dim ;
}
std::ostream & operator << (std::ostream & os , FieldDescription & fdes ) {
os << " name = " << fdes.name << std::endl ;
os << " file_name = " << fdes.file_name << std::endl ;
os << " namespaces =" ;
ConstructValues::NamespaceIterator it ;
for ( it = fdes.namespace_begin() ; it != fdes.namespace_end() ; it++ ) {
os << " " << *it ;
}
os << std::endl ;
os << " parent classes =" ;
for ( it = fdes.container_class_begin() ; it != fdes.container_class_end() ; it++ ) {
os << " " << *it ;
}
os << std::endl ;
os << " line_no = " << fdes.line_no << std::endl ;
os << " container_class = " << fdes.container_class << std::endl ;
os << " type_name = " << fdes.type_name << std::endl ;
os << " mangled_type_name = " << fdes.mangled_type_name << std::endl ;
os << " type_enum_string = " << fdes.type_enum_string << std::endl ;
os << " units = " << fdes.units << std::endl ;
os << " io = " << fdes.io << std::endl ;
os << " description = " << fdes.description << std::endl ;
os << " access = " << fdes.access << std::endl ;
os << " is_bitfield = " << fdes.is_bitfield << std::endl ;
os << " bitfield_width = " << fdes.bitfield_width << std::endl ;
os << " bitfield_start_bit = " << fdes.bitfield_start_bit << std::endl ;
os << " bitfield_word_offset = " << fdes.bitfield_word_offset << std::endl ;
os << " num_dims = " << fdes.num_dims << std::endl ;
os << " array_sizes =" ;
for( unsigned int ii = 0 ; ii < 8 ; ii++ ) {
os << " " << fdes.array_sizes[ii] ;
}
os << std::endl ;
os << " is_enum = " << fdes.is_enum << std::endl ;
os << " is_record = " << fdes.is_record << std::endl ;
os << " is_static = " << fdes.is_static << std::endl ;
return os ;
}

View File

@ -53,6 +53,7 @@ class FieldDescription : public ConstructValues {
unsigned int getLineNo() ;
void setMangledTypeName( std::string in_val ) ;
std::string getMangledTypeName() ;
std::string getFullyQualifiedMangledTypeName(const std::string& delimiter = "::") ;
std::string getUnits() ;
bool isDashDashUnits() ;
void setIO(unsigned int) ;
@ -92,8 +93,6 @@ class FieldDescription : public ConstructValues {
/** Adds an array dimension to the field */
void addArrayDim( int in_dim ) ;
friend std::ostream & operator << (std::ostream & os , FieldDescription & cv ) ;
private:
/** Line number in current file where field is */

View File

@ -296,7 +296,7 @@ bool FieldVisitor::ProcessTemplate(std::string in_name , clang::CXXRecordDecl *
if ( debug_level >= 4 ) {
std::cout << "Added template class from FieldVisitor ProcessTemplate " ;
std::cout << in_name << std::endl ;
std::cout << *fdes << std::endl ;
//std::cout << *fdes << std::endl ;
}
}

View File

@ -13,7 +13,7 @@
#include "PrintAttributes.hh"
#include "PrintFileContentsBase.hh"
#include "PrintAttributesFactory.hh"
#include "PrintFileContents10.hh"
#include "HeaderSearchDirs.hh"
#include "CommentSaver.hh"
#include "ClassValues.hh"
@ -30,7 +30,7 @@ PrintAttributes::PrintAttributes(int in_attr_version , HeaderSearchDirs & in_hsd
sim_services_flag( in_sim_services_flag ) ,
output_dir( in_output_dir )
{
printer = createFileContents(in_attr_version) ;
printer = new PrintFileContents10() ;
}
/**

View File

@ -1,35 +0,0 @@
#include <iostream>
#include <stdlib.h>
#include "PrintFileContentsBase.hh"
#include "PrintFileContents10.hh"
#include "PrintFileContents13.hh"
/** returns true if the command line attributes version is supported */
bool validAttributesVersion( int attr_version ) {
switch (attr_version) {
case 10:
case 13:
return true ;
default:
return false ;
}
}
/**
Returns a PrintFileContentsBase pointer to a version specific
print class based on attribute version
*/
PrintFileContentsBase * createFileContents( int attr_version ) {
switch (attr_version) {
case 10:
return new PrintFileContents10() ;
case 13:
return new PrintFileContents13() ;
default:
std::cout << "OK, how did you get here with an invalid attributes version " << attr_version << std::endl ;
exit(-1) ;
}
}

View File

@ -1,19 +0,0 @@
#ifndef PRINTATTRIBUTESFACTORY_HH
#define PRINTATTRIBUTESFACTORY_HH
#include <iostream>
#include <fstream>
class PrintFileContentsBase ;
/** returns true if the command line attributes version is supported */
bool validAttributesVersion( int attr_version ) ;
/**
Returns a PrintFileContentsBase pointer to a version specific
print class based on attribute version
*/
PrintFileContentsBase * createFileContents( int attr_version ) ;
#endif

View File

@ -19,44 +19,37 @@ void PrintFileContents10::printIOHeader(std::ostream & ostream , std::string hea
} else {
header_file_name = almostRealPath(header_file_name.c_str()) ;
}
ostream <<
"/**\n"
" * This file was automatically generated by the ICG based on the file:\n"
" * " << header_file_name << "\n"
" * This file contains database parameter declarations specific to the\n"
" * data structures and enumerated types declared in the above file.\n"
" * These database parameters are used by the Trick input and\n"
" * data recording processors to gain access to important simulation\n"
" * variable information.\n"
" */\n"
"\n"
"#define TRICK_IN_IOSRC\n"
"#include <stdlib.h>\n"
"#include \"trick/MemoryManager.hh\"\n"
"#include \"trick/attributes.h\"\n"
"#include \"trick/parameter_types.h\"\n"
"#include \"trick/ClassSizeCheck.hh\"\n"
"#include \"trick/UnitsMap.hh\"\n"
"#include \"trick/checkpoint_stl.hh\"\n"
"#include \"" << header_file_name << "\"\n"
"\n" ;
ostream << "/**\n"
<< " * This file was automatically generated by the ICG based on the file:\n"
<< " * " << header_file_name << "\n"
<< " * This file contains database parameter declarations specific to the\n"
<< " * data structures and enumerated types declared in the above file.\n"
<< " * These database parameters are used by the Trick input and\n"
<< " * data recording processors to gain access to important simulation\n"
<< " * variable information.\n"
<< " */\n"
<< "\n"
<< "#define TRICK_IN_IOSRC\n"
<< "#include <stdlib.h>\n"
<< "#include \"trick/MemoryManager.hh\"\n"
<< "#include \"trick/attributes.h\"\n"
<< "#include \"trick/parameter_types.h\"\n"
<< "#include \"trick/ClassSizeCheck.hh\"\n"
<< "#include \"trick/UnitsMap.hh\"\n"
<< "#include \"trick/checkpoint_stl.hh\"\n"
<< "#include \"" << header_file_name << "\"\n"
<< "\n" ;
}
/** Prints enumeration attributes */
void PrintFileContents10::print_enum_attr(std::ostream & ostream , EnumValues * e ) {
print_open_extern_c(ostream) ;
ostream << "ENUM_ATTR enum" ;
printNamespaces( ostream, e , "__" ) ;
printContainerClasses( ostream, e , "__" ) ;
ostream << e->getName() << "[] = {\n" ;
for ( EnumValues::NameValueIterator nvit = e->begin() ; nvit != e->end() ; nvit++ ) {
ostream << "{\"";
printNamespaces( ostream, e , "::" ) ;
printContainerClasses( ostream, e , "::" ) ;
ostream << (*nvit).first << "\" , " << (*nvit).second << " , 0x0 } ,\n" ;
ostream << "ENUM_ATTR enum" << e->getFullyQualifiedTypeName("__") << "[] = {\n" ;
std::string name = e->getNamespacesAndContainerClasses();
for (auto& pair : e->getPairs()) {
ostream << "{\"" << name << pair.first << "\", " << pair.second << ", 0x0},\n" ;
}
ostream << "{\"\" , 0 , 0x0 }\n} ;\n" ;
ostream << "{\"\", 0, 0x0}\n};\n" ;
print_close_extern_c(ostream) ;
}
@ -64,29 +57,26 @@ void PrintFileContents10::print_enum_attr(std::ostream & ostream , EnumValues *
void PrintFileContents10::print_field_attr(std::ostream & ostream , FieldDescription * fdes ) {
int array_dim ;
ostream << "{ \"" << fdes->getName() << "\"" ; // name
ostream << ", \"" ; // start type_name
printNamespaces( ostream, fdes , "__" ) ;
printContainerClasses( ostream, fdes , "__" ) ;
ostream << fdes->getMangledTypeName() << "\""; // end type_name
ostream << ", \"" << fdes->getUnits() << "\"" ; // units
ostream << ", \"\", \"\"," << std::endl ; // alias , user_defined
ostream << " \"" << fdes->getDescription() << "\"," << std::endl ; // description
ostream << " " << fdes->getIO() ; // io
ostream << "," << fdes->getEnumString() ; // type
ostream << "{\"" << fdes->getName() << "\"" // name
<< ", \"" << fdes->getFullyQualifiedMangledTypeName("__") << "\"" // type_name
<< ", \"" << fdes->getUnits() << "\"" // units
<< ", \"\", \"\"," << std::endl // alias, user_defined
<< " \"" << fdes->getDescription() << "\"," << std::endl // description
<< " " << fdes->getIO() // io
<< "," << fdes->getEnumString() ; // type
// There are several cases when printing the size of a variable.
if ( fdes->isBitField() ) {
// bitfields are handled in 4 byte (32 bit) chunks
ostream << ",4" ;
ostream << ", 4" ;
} else if ( fdes->isRecord() or fdes->isEnum() or fdes->getTypeName().empty() ) {
// records enums use io_src_get_size. The sentinel has no typename
ostream << ",0" ;
ostream << ", 0" ;
} else {
// print size of the underlying type
ostream << ",sizeof(" << fdes->getTypeName() << ")" ;
ostream << ", sizeof(" << fdes->getTypeName() << ")" ;
}
ostream << ",0,0,Language_CPP" ; // range_min, range_max, language
ostream << "," << (fdes->isStatic() << 1) + (fdes->isDashDashUnits() << 2) << "," << std::endl ; // mods
ostream << ", 0, 0, Language_CPP" ; // range_min, range_max, language
ostream << ", " << (fdes->isStatic() << 1) + (fdes->isDashDashUnits() << 2) << "," << std::endl ; // mods
if ( fdes->isBitField() ) {
// For bitfields we need the offset to start on 4 byte boundaries because that is what our
// insert and extract bitfield routines work with.
@ -94,23 +84,23 @@ void PrintFileContents10::print_field_attr(std::ostream & ostream , FieldDescri
} else {
ostream << " " << (fdes->getFieldOffset() / 8) ; // offset
}
ostream << ",NULL" ; // attr
ostream << "," << fdes->getNumDims() ; // num_index
ostream << ", NULL" ; // attr
ostream << ", " << fdes->getNumDims() ; // num_index
ostream << ",{" ;
ostream << ", {" ;
if ( fdes->isBitField() ) {
ostream << "{" << fdes->getBitFieldWidth() ; // size of bitfield
ostream << "," << 32 - (fdes->getFieldOffset() % 32) - fdes->getBitFieldWidth() << "}" ; // start bit
ostream << ", " << 32 - (fdes->getFieldOffset() % 32) - fdes->getBitFieldWidth() << "}" ; // start bit
} else {
array_dim = fdes->getArrayDim(0) ;
if ( array_dim < 0 ) array_dim = 0 ;
ostream << "{" << array_dim << ",0}" ; // index 0
ostream << "{" << array_dim << ", 0}" ; // index 0
}
unsigned int ii ;
for ( ii = 1 ; ii < 8 ; ii++ ) {
array_dim = fdes->getArrayDim(ii) ;
if ( array_dim < 0 ) array_dim = 0 ;
ostream << ",{" << array_dim << ",0}" ; // indexes 1 through 7
ostream << ", {" << array_dim << ", 0}" ; // indexes 1 through 7
}
ostream << "}," << std::endl ;
ostream << " NULL, NULL, NULL, NULL" ;
@ -120,19 +110,12 @@ void PrintFileContents10::print_field_attr(std::ostream & ostream , FieldDescri
/** Prints class attributes */
void PrintFileContents10::print_class_attr(std::ostream & ostream , ClassValues * c ) {
unsigned int ii ;
ClassValues::FieldIterator fit ;
print_open_extern_c(ostream) ;
ostream << "ATTRIBUTES attr" ;
printNamespaces( ostream, c , "__" ) ;
printContainerClasses( ostream, c , "__" ) ;
ostream << c->getMangledTypeName() ;
ostream << "[] = {" << std::endl ;
ostream << "ATTRIBUTES attr" << c->getFullyQualifiedMangledTypeName("__") << "[] = {" << std::endl ;
for ( fit = c->field_begin() ; fit != c->field_end() ; fit++ ) {
if ( determinePrintAttr(c , *fit) ) {
print_field_attr(ostream, *fit) ;
for (auto& fieldDescription : c->getFieldDescriptions()) {
if ( determinePrintAttr(c , fieldDescription) ) {
print_field_attr(ostream, fieldDescription) ;
ostream << "," << std::endl ;
}
}
@ -149,158 +132,80 @@ void PrintFileContents10::print_class_attr(std::ostream & ostream , ClassValues
void PrintFileContents10::print_field_init_attr_stmts( std::ostream & ostream , FieldDescription * fdes ,
ClassValues * cv , unsigned int index ) {
// For static variables replace the offset field with the address of the static variable
if ( global_compat15 or cv->isCompat15()) {
if ( fdes->isStatic() ) {
// print a special offsetof statement if this is a static
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].offset = (long)(void *)&" ;
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
ostream << cv->getName() << "::" << fdes->getName() << " ;\n" ;
} else if ( fdes->isBitField() ) {
// else if this is a bitfield
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].offset = " ;
ostream << fdes->getBitFieldByteOffset() << " ;\n" ;
// All bitfield offsets are in terms of unsigned ints.
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].size = sizeof(unsigned int) ;\n" ;
} else if ( fdes->isVirtualInherited() ) {
// else if we have a virtually inherited class.
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].offset = " << fdes->getBaseClassOffset() ;
ostream << " + offsetof(" ;
ostream << fdes->getContainerClass() << "," << fdes->getName() << ") ;\n" ;
} else if ( cv->getMangledTypeName() != cv->getName() ) {
// else if we have a template type where mangled_type_name is different then name.
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].offset = offsetof(" ;
ostream << cv->getMangledTypeName() << "," << fdes->getName() << ") ;\n" ;
} else {
// else print an offsetof statement if this is not a special case
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].offset = offsetof(" ;
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
ostream << cv->getMangledTypeName() << "," << fdes->getName() << ") ;\n" ;
const std::string className = cv->getName();
const std::string mangledClassName = cv->getMangledTypeName();
const std::string fieldName = fdes->getName();
const std::string fullyQualifiedClassNameColons = cv->getFullyQualifiedTypeName();
const std::string fullyQualifiedMangledClassNameColons = cv->getFullyQualifiedMangledTypeName();
const std::string fullyQualifiedMangledClassNameUnderscores = cv->getFullyQualifiedMangledTypeName("__");
std::ostringstream oss;
oss << " attr" << fullyQualifiedMangledClassNameUnderscores << "[" << index << "].";
const std::string prefix = oss.str();
if ( fdes->isStatic() ) {
ostream << prefix << "offset = (long)(void *)&" << fullyQualifiedClassNameColons << "::" << fieldName << " ;\n" ;
}
else if ( global_compat15 or cv->isCompat15() ) {
if ( fdes->isBitField() ) {
ostream << prefix << "offset = " << fdes->getBitFieldByteOffset() << " ;\n" ;
ostream << prefix << "size = sizeof(unsigned int) ;\n" ;
}
} else {
if ( fdes->isStatic() ) {
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].offset = (long)(void *)&" ;
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
ostream << cv->getName() << "::" << fdes->getName() << " ;\n" ;
else if ( fdes->isVirtualInherited() ) {
ostream << prefix << "offset = " << fdes->getBaseClassOffset() << " + offsetof(" << fdes->getContainerClass() << ", " << fieldName << ") ;\n" ;
}
else if ( mangledClassName != className ) {
ostream << prefix << "offset = " << "offsetof(" << mangledClassName << ", " << fieldName << ") ;\n" ;
}
else {
ostream << prefix << "offset = " << "offsetof(" << fullyQualifiedMangledClassNameColons << ", " << fieldName << ") ;\n" ;
}
}
if ( fdes->isSTL()) {
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].checkpoint_stl = checkpoint_stl_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "_" ;
ostream << fdes->getName() ;
ostream << " ;\n" ;
if ( fdes->isSTL() ) {
auto print = [&](const std::string& field) {
ostream << prefix << field << " = " << field << "_" << fullyQualifiedMangledClassNameUnderscores + "_" + fieldName + " ;\n";
};
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].post_checkpoint_stl = post_checkpoint_stl_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "_" ;
ostream << fdes->getName() ;
ostream << " ;\n" ;
print("checkpoint_stl");
print("post_checkpoint_stl");
print("restore_stl");
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].restore_stl = restore_stl_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "_" ;
ostream << fdes->getName() ;
ostream << " ;\n" ;
if (fdes->hasSTLClear()) {
ostream << " attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].clear_stl = clear_stl_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "_" ;
ostream << fdes->getName() ;
ostream << " ;\n" ;
if ( fdes->hasSTLClear() ) {
print("clear_stl");
}
}
if ( fdes->isRecord() or fdes->isEnum()) {
ostream << " trick_MM->add_attr_info(std::string(attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "].type_name) , &attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[" << index << "], __FILE__ , __LINE__ ) ;\n" ;
if ( fdes->isRecord() or fdes->isEnum() ) {
ostream << " trick_MM->add_attr_info(std::string(attr" << fullyQualifiedMangledClassNameUnderscores << "[" << index << "].type_name) , &attr" << fullyQualifiedMangledClassNameUnderscores << "[" << index << "], __FILE__ , __LINE__ ) ;\n" ;
}
}
/** Prints add_attr_info statements for each inherited class */
void PrintFileContents10::print_inherited_add_attr_info( std::ostream & ostream , ClassValues * cv ) {
ClassValues::InheritedClassesIterator cit ;
if ( cv->getNumInheritedClasses() > 0 ) {
auto inheritedClasses = cv->getInheritedClasses();
if ( inheritedClasses.size() > 0 ) {
ostream << "\n ATTRIBUTES temp_attr ;\n\n" ;
}
for ( cit = cv->inherit_classes_begin() ; cit != cv->inherit_classes_end() ; cit++ ) {
ostream << " trick_MM->add_attr_info( std::string(\"" << *cit << "\"), &temp_attr , __FILE__ , __LINE__ ) ;\n" ;
for ( auto& inheritedClass : inheritedClasses ) {
ostream << " trick_MM->add_attr_info( std::string(\"" << inheritedClass << "\"), &temp_attr , __FILE__ , __LINE__ ) ;\n" ;
}
}
/** Prints init_attr function for each class */
void PrintFileContents10::print_init_attr_func( std::ostream & ostream , ClassValues * cv ) {
cv->printOpenNamespaceBlocks(ostream) ;
ostream << "\nvoid init_attr" << cv->getFullyQualifiedMangledTypeName("__") << "() {\n\n"
<< " static int initialized ;\n"
<< " if (initialized) {\n"
<< " return;\n"
<< " }\n"
<< " initialized = 1;\n\n" ;
ClassValues::FieldIterator fit ;
printOpenNamespaceBlocks(ostream, cv) ;
ostream << "\nvoid init_attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "() {\n\n"
" static int initialized ;\n"
" if ( initialized ) {\n"
" return ;\n"
" }\n"
" initialized = 1 ;\n\n" ;
#if 0
if ( cv->getMangledTypeName() != cv->getName() ) {
ostream << " typedef " << cv->getName() << " " << cv->getMangledTypeName() << " ;\n\n" ;
}
#if 0
if ( !global_compat15 and !cv->isCompat15()) {
ostream << " if ( sizeof(" ;
printNamespaces( ostream, cv , "::" ) ;
@ -317,296 +222,172 @@ void PrintFileContents10::print_init_attr_func( std::ostream & ostream , ClassVa
}
#endif
unsigned int ii = 0 ;
for ( fit = cv->field_begin() ; fit != cv->field_end() ; fit++ ) {
if ( determinePrintAttr(cv , *fit) ) {
print_field_init_attr_stmts(ostream, *fit, cv, ii) ;
ii++ ;
unsigned int ii = 0;
for ( auto field : cv->getFieldDescriptions() ) {
if ( determinePrintAttr(cv, field) ) {
print_field_init_attr_stmts(ostream, field, cv, ii++) ;
}
}
print_inherited_add_attr_info(ostream, cv ) ;
ostream << "}\n" ;
printCloseNamespaceBlocks(ostream, cv) ;
cv->printCloseNamespaceBlocks(ostream) ;
}
/** Prints the io_src_sizeof function for enumerations */
void PrintFileContents10::print_enum_io_src_sizeof( std::ostream & ostream , EnumValues * ev ) {
print_open_extern_c(ostream) ;
ostream << "size_t io_src_sizeof_" ;
printNamespaces( ostream, ev , "__" ) ;
printContainerClasses( ostream, ev , "__" ) ;
ostream << ev->getName() << "( void ) {\n" ;
ostream << "size_t io_src_sizeof_" << ev->getFullyQualifiedName("__") << "( void ) {\n" ;
if ( ev->getHasDefinition() ) {
ostream << " return( sizeof(" ;
printNamespaces( ostream, ev , "::" ) ;
printContainerClasses( ostream, ev , "::" ) ;
ostream << ev->getName() << "));\n}\n" ;
ostream << " return sizeof(" << ev->getFullyQualifiedName() << ")" ;
} else {
ostream << " return(sizeof(int)) ;\n}\n" ;
ostream << " return sizeof(int)" ;
}
ostream << ";\n}\n" ;
print_close_extern_c(ostream) ;
}
/** Prints the C linkage init_attr function */
void PrintFileContents10::print_init_attr_c_intf( std::ostream & ostream , ClassValues * cv ) {
ostream << "void init_attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "_c_intf() {\n " ;
printNamespaces( ostream, cv , "::" ) ;
ostream << "init_attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "() ;\n"
"}\n\n" ;
ostream << "void init_attr" << cv->getFullyQualifiedMangledTypeName("__") << "_c_intf() {\n " ;
cv->printNamespaces( ostream, "::" ) ;
ostream << "init_attr" << cv->getFullyQualifiedMangledTypeName("__") << "() ;\n"
<< "}\n\n" ;
}
/** Prints the io_src_sizeof function */
void PrintFileContents10::print_io_src_sizeof( std::ostream & ostream , ClassValues * cv ) {
ostream << "size_t io_src_sizeof_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "( void ) {\n" ;
ostream << " return( sizeof(" ;
// Template types
if ( cv->getMangledTypeName() == cv->getName() ) {
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
}
ostream << cv->getName() << ") );\n}\n\n" ;
ostream << "size_t io_src_sizeof_" << cv->getFullyQualifiedMangledTypeName("__") << "() {\n" ;
ostream << " return sizeof(" << cv->getFullyQualifiedNameIfEqual() << ") ;\n}\n\n" ;
}
/** Prints the io_src_allocate function */
void PrintFileContents10::print_io_src_allocate( std::ostream & ostream , ClassValues * cv ) {
if ( cv->isPOD() or (! cv->isAbstract() and cv->getHasDefaultConstructor()) ) {
ostream << "void * io_src_allocate_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "( int num) {\n" ;
ostream << " " ;
if ( cv->getMangledTypeName() == cv->getName() ) {
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
}
ostream << cv->getName() << " * temp = (" ;
if ( cv->getMangledTypeName() == cv->getName() ) {
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
}
ostream << cv->getName() << " * )calloc( num, sizeof(" ;
if ( cv->getMangledTypeName() == cv->getName() ) {
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
}
ostream << cv->getName() << "));\n" ;
if ( cv->isPOD() or ( !cv->isAbstract() and cv->getHasDefaultConstructor()) ) {
const std::string name = cv->getFullyQualifiedNameIfEqual();
ostream << "void* io_src_allocate_" << cv->getFullyQualifiedMangledTypeName("__") << "(int num) {\n" ;
ostream << " " << name << "* temp = (" << name << "*)calloc(num, sizeof(" << name << "));\n" ;
if ( ! cv->isPOD() ) {
ostream << " for (int ii=0 ; ii<num ; ii++) {\n" ;
ostream << " new( &temp[ii]) " ;
if ( cv->getMangledTypeName() == cv->getName() ) {
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
}
ostream << cv->getName() << "();\n" << " }\n" ;
ostream << " for (int ii = 0; ii < num; ++ii) {\n" ;
ostream << " new(&temp[ii]) " << name << "();\n }\n" ;
}
ostream << " return ((void *)temp);\n" << "}\n\n" ;
ostream << " return (void*)temp;\n" << "}\n\n" ;
}
}
/** Prints the io_src_allocate function */
void PrintFileContents10::print_io_src_destruct( std::ostream & ostream , ClassValues * cv ) {
if ( cv->getHasPublicDestructor()) {
ostream << "void io_src_destruct_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "( void * addr __attribute__((unused)), int num __attribute__((unused)) ) {\n" ;
if ( cv->getHasPublicDestructor() ) {
ostream << "void io_src_destruct_" << cv->getFullyQualifiedMangledTypeName("__") << "(void* address __attribute__((unused)), int num __attribute__((unused))) {\n" ;
if ( ! cv->isPOD() ) {
// Add a using statement so we can call the destructor without fully qualifying it.
ClassValues::NamespaceIterator nsi = cv->namespace_begin() ;
if ( nsi != cv->namespace_end() ) {
auto namespaces = cv->getNamespaces();
if (namespaces.size()) {
ostream << " using namespace " ;
while ( nsi != cv->namespace_end() ) {
ostream << *nsi ;
nsi++ ;
if ( nsi != cv->namespace_end()) {
ostream << "::" ;
auto last = namespaces[namespaces.size() - 1];
for (auto& name : namespaces) {
ostream << name;
if (name != last) {
ostream << "::";
}
}
ostream << " ;\n" ;
ostream << ";\n " ;
}
ostream << " " ;
if ( cv->getMangledTypeName() == cv->getName() ) {
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
const std::string name = cv->getName();
const std::string qualifiedName = cv->getFullyQualifiedNameIfEqual();
ostream << qualifiedName << "* temp = (" << qualifiedName << "*)address;\n" ;
if ( cv->getMangledTypeName() == name ) {
ostream << " for (int ii = 0; ii < num; ++ii) {\n"
<< " temp[ii].~" << name << "();\n"
<< " }\n" ;
}
ostream << cv->getName() << " * temp = (" ;
if ( cv->getMangledTypeName() == cv->getName() ) {
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
}
ostream << cv->getName() << " * )addr ;\n" ;
ostream << " for (int ii=0 ; ii<num ; ii++) {\n" ;
if ( cv->getMangledTypeName() == cv->getName() ) {
ostream << " temp[ii].~" ;
ostream << cv->getName() << "();\n" ;
}
ostream << " }\n" ;
}
ostream << "}\n\n" ;
}
}
void PrintFileContents10::print_io_src_delete( std::ostream & ostream , ClassValues * cv ) {
if ( cv->getHasPublicDestructor()) {
ostream << "void io_src_delete_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "( void * addr " ;
if ( cv->getHasPublicDestructor() ) {
ostream << "void io_src_delete_" << cv->getFullyQualifiedMangledTypeName("__") << "(void* address" ;
if ( ! cv->isPOD() ) {
ostream << ") {\n" ;
ostream << " delete (" ;
if ( cv->getMangledTypeName() == cv->getName() ) {
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
}
ostream << cv->getName() << "*)addr ;\n" ;
ostream << ") {\n delete (" << cv->getFullyQualifiedNameIfEqual() << "*)address;\n" ;
}
else {
ostream << "__attribute__((unused)) ) {" ;
ostream << " __attribute__((unused))) {" ;
}
ostream << "}\n" ;
}
}
void PrintFileContents10::print_stl_helper_proto(std::ostream & ostream , ClassValues * cv ) {
std::ostringstream oss;
auto& fieldDescriptions = cv->getFieldDescriptions();
for ( ClassValues::FieldIterator fit = cv->field_begin() ; fit != cv->field_end() ; fit++ ) {
if ( (*fit)->isSTL() and determinePrintAttr(cv , *fit) ) {
oss << "void checkpoint_stl_" ;
printNamespaces( oss, cv , "__" ) ;
printContainerClasses( oss, cv , "__" ) ;
oss << cv->getMangledTypeName() ;
oss << "_" ;
oss << (*fit)->getName() ;
oss << "(void * start_address, const char * obj_name , const char * var_name) ;" << std::endl ;
if (!fieldDescriptions.size()) {
return;
}
oss << "void post_checkpoint_stl_" ;
printNamespaces( oss, cv , "__" ) ;
printContainerClasses( oss, cv , "__" ) ;
oss << cv->getMangledTypeName() ;
oss << "_" ;
oss << (*fit)->getName() ;
oss << "(void * start_address, const char * obj_name , const char * var_name) ;" << std::endl ;
print_open_extern_c(ostream) ;
oss << "void restore_stl_" ;
printNamespaces( oss, cv , "__" ) ;
printContainerClasses( oss, cv , "__" ) ;
oss << cv->getMangledTypeName() ;
oss << "_" ;
oss << (*fit)->getName() ;
oss << "(void * start_address, const char * obj_name , const char * var_name) ;" << std::endl ;
for (auto& field : cv->getFieldDescriptions()) {
if ( field->isSTL() and determinePrintAttr(cv, field) ) {
const std::string classAndFieldName = cv->getFullyQualifiedMangledTypeName("__") + "_" + field->getName();
if ((*fit)->hasSTLClear()) {
oss << "void clear_stl_" ;
printNamespaces( oss, cv , "__" ) ;
printContainerClasses( oss, cv , "__" ) ;
oss << cv->getMangledTypeName() ;
oss << "_" ;
oss << (*fit)->getName() ;
oss << "(void * start_address) ;" << std::endl ;
auto print = [&](const std::string& name) {
ostream << "void " << name << "_" << classAndFieldName
<< "(void* start_address, const char* obj_name , const char* var_name);" << std::endl ;
};
print("checkpoint_stl");
print("post_checkpoint_stl");
print("restore_checkpoint_stl");
if ( field->hasSTLClear() ) {
ostream << "void clear_stl_" << classAndFieldName << "(void* start_address);" << std::endl ;
}
}
}
std::string text = oss.str();
if (text.size()) {
print_open_extern_c(ostream) ;
ostream << text;
print_close_extern_c(ostream) ;
}
print_close_extern_c(ostream) ;
}
void PrintFileContents10::print_checkpoint_stl(std::ostream & ostream , FieldDescription * fdes , ClassValues * cv ) {
ostream << "void checkpoint_stl_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "_" ;
ostream << fdes->getName() ;
ostream << "(void * start_address, const char * obj_name , const char * var_name) {" << std::endl ;
ostream << " " << fdes->getTypeName() << " * stl = reinterpret_cast<" << fdes->getTypeName() << " * >(start_address) ;" << std::endl ;
ostream << " " << "checkpoint_stl(*stl , obj_name , var_name) ;" << std::endl ;
ostream << "}" << std::endl ;
printStlFunction("checkpoint", "void* start_address, const char* obj_name , const char* var_name", "checkpoint_stl(*stl, obj_name, var_name)", ostream, *fdes, *cv);
}
void PrintFileContents10::print_post_checkpoint_stl(std::ostream & ostream , FieldDescription * fdes , ClassValues * cv ) {
ostream << "void post_checkpoint_stl_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "_" ;
ostream << fdes->getName() ;
ostream << "(void * start_address, const char * obj_name , const char * var_name) {" << std::endl ;
ostream << " " << fdes->getTypeName() << " * stl = reinterpret_cast<" << fdes->getTypeName() << " * >(start_address) ;" << std::endl ;
ostream << " " << "delete_stl(*stl , obj_name , var_name) ;" << std::endl ;
ostream << "}" << std::endl ;
printStlFunction("post_checkpoint", "void* start_address, const char* obj_name , const char* var_name", "delete_stl(*stl, obj_name, var_name)", ostream, *fdes, *cv);
}
void PrintFileContents10::print_restore_stl(std::ostream & ostream , FieldDescription * fdes , ClassValues * cv ) {
ostream << "void restore_stl_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "_" ;
ostream << fdes->getName() ;
ostream << "(void * start_address, const char * obj_name , const char * var_name) {" << std::endl ;
ostream << " " << fdes->getTypeName() << " * stl = reinterpret_cast<" << fdes->getTypeName() << " * >(start_address) ;" << std::endl ;
ostream << " " << "restore_stl(*stl , obj_name , var_name) ;" << std::endl ;
ostream << "}" << std::endl ;
printStlFunction("restore", "void* start_address, const char* obj_name , const char* var_name", "restore_stl(*stl, obj_name, var_name)",ostream, *fdes, *cv);
}
void PrintFileContents10::print_clear_stl(std::ostream & ostream , FieldDescription * fdes , ClassValues * cv ) {
ostream << "void clear_stl_" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "_" ;
ostream << fdes->getName() ;
ostream << "(void * start_address) {" << std::endl ;
ostream << " " << fdes->getTypeName() << " * stl = reinterpret_cast<" << fdes->getTypeName() << " * >(start_address) ;" << std::endl ;
ostream << " " << "stl->clear() ;" << std::endl ;
ostream << "}" << std::endl ;
printStlFunction("clear", "void* start_address", "stl->clear()",ostream, *fdes, *cv);
}
void PrintFileContents10::print_stl_helper(std::ostream & ostream , ClassValues * cv ) {
std::ostringstream oss;
auto& fieldDescriptions = cv->getFieldDescriptions();
for ( ClassValues::FieldIterator fit = cv->field_begin() ; fit != cv->field_end() ; fit++ ) {
if ( (*fit)->isSTL() and determinePrintAttr(cv , *fit) ) {
print_checkpoint_stl(oss , *fit, cv) ;
print_post_checkpoint_stl(oss , *fit, cv) ;
print_restore_stl(oss , *fit, cv) ;
if ((*fit)->hasSTLClear()) {
print_clear_stl(oss , *fit, cv) ;
if (!fieldDescriptions.size()) {
return;
}
print_open_extern_c(ostream) ;
for (auto& field : fieldDescriptions) {
if ( field->isSTL() and determinePrintAttr(cv, field) ) {
print_checkpoint_stl(ostream, field, cv) ;
print_post_checkpoint_stl(ostream, field, cv) ;
print_restore_stl(ostream, field, cv) ;
if (field->hasSTLClear()) {
print_clear_stl(ostream, field, cv) ;
}
}
}
std::string text = oss.str();
if (text.size()) {
print_open_extern_c(ostream) ;
ostream << text;
print_close_extern_c(ostream) ;
}
print_close_extern_c(ostream) ;
}
void PrintFileContents10::printClass( std::ostream & ostream , ClassValues * cv ) {
@ -646,19 +427,10 @@ void PrintFileContents10::printClassMapHeader( std::ostream & ostream , std::str
}
void PrintFileContents10::printClassMap( std::ostream & ostream , ClassValues * cv ) {
ostream << " // " << cv->getFileName() << std::endl ;
ostream << " extern ATTRIBUTES attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << "[] ;" << std::endl ;
ostream << " class_attribute_map->add_attr(\"" ;
printNamespaces( ostream, cv , "::" ) ;
printContainerClasses( ostream, cv , "::" ) ;
ostream << cv->getMangledTypeName() << "\" , attr" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() << ") ;" << std::endl ;
std::string name = cv->getFullyQualifiedMangledTypeName("__");
ostream << " // " << cv->getFileName() << std::endl
<< " extern ATTRIBUTES attr" << name << "[] ;" << std::endl
<< " class_attribute_map->add_attr(\"" << cv->getFullyQualifiedMangledTypeName() << "\" , attr" << name << ") ;" << std::endl ;
}
void PrintFileContents10::printClassMapFooter( std::ostream & ostream ) {
@ -666,26 +438,26 @@ void PrintFileContents10::printClassMapFooter( std::ostream & ostream ) {
}
void PrintFileContents10::printEnumMapHeader( std::ostream & ostream , std::string function_name ) {
ostream <<
"void " << function_name << "() {\n"
" Trick::EnumAttributesMap * enum_attribute_map __attribute__((unused)) = Trick::EnumAttributesMap::attributes_map();\n\n" ;
ostream << "void " << function_name << "() {\n"
<< " Trick::EnumAttributesMap* enum_attribute_map __attribute__((unused)) = Trick::EnumAttributesMap::attributes_map();\n\n" ;
}
void PrintFileContents10::printEnumMap( std::ostream & ostream , EnumValues * ev ) {
ostream << " extern ENUM_ATTR enum" ;
printNamespaces( ostream, ev , "__" ) ;
printContainerClasses( ostream, ev , "__" ) ;
ostream << ev->getName() << "[] ;" << std::endl ;
ostream << " enum_attribute_map->add_attr(\"" ;
printNamespaces( ostream, ev , "::" ) ;
printContainerClasses( ostream, ev , "::" ) ;
ostream << ev->getName() << "\" , enum" ;
printNamespaces( ostream, ev , "__" ) ;
printContainerClasses( ostream, ev , "__" ) ;
ostream << ev->getName() << ") ;" << std::endl ;
std::string name = ev->getFullyQualifiedTypeName("__");
ostream << " extern ENUM_ATTR enum" << name << "[];" << std::endl
<< " enum_attribute_map->add_attr(\"" << ev->getFullyQualifiedTypeName() << "\", enum" << name << ");" << std::endl ;
}
void PrintFileContents10::printEnumMapFooter( std::ostream & ostream ) {
ostream << "}" << std::endl << std::endl ;
}
void PrintFileContents10::printStlFunction(const std::string& name, const std::string& parameters, const std::string& call, std::ostream& ostream, FieldDescription& fieldDescription, ClassValues& classValues) {
const std::string typeName = fieldDescription.getTypeName();
const std::string functionName = name + "_stl";
ostream << "void " << functionName << "_" << classValues.getFullyQualifiedMangledTypeName("__") << "_" << fieldDescription.getName()
<< "(" << parameters << ") {" << std::endl
<< " " << typeName << "* stl = reinterpret_cast<" << typeName << "*>(start_address);" << std::endl
<< " " << call << ";" << std::endl
<< "}" << std::endl ;
}

View File

@ -103,6 +103,8 @@ class PrintFileContents10 : public PrintFileContentsBase {
/** Prints stl clear function */
void print_clear_stl(std::ostream & outfile , FieldDescription * fdes , ClassValues * in_class) ;
void printStlFunction(const std::string& name, const std::string& parameters, const std::string& call, std::ostream& ostream, FieldDescription& fieldDescription, ClassValues& classValues);
} ;
#endif

View File

@ -1,209 +0,0 @@
#include <sstream>
#include <libgen.h>
#include <sys/stat.h>
#include "PrintFileContents13.hh"
#include "FieldDescription.hh"
#include "ClassValues.hh"
#include "EnumValues.hh"
PrintFileContents13::PrintFileContents13() {}
/**
*/
void PrintFileContents13::printIOHeader(std::ostream & ostream , std::string header_file_name) {
if ( ! header_file_name.compare("S_source.hh") ) {
header_file_name = "../S_source.hh" ;
}
ostream << "\n"
"/*\n"
" * This file was automatically generated by the ICG based on the file:\n"
" * " << header_file_name << "\n"
" */\n"
"#include \"" << header_file_name << "\"\n"
"#include <stddef.h>\n" // for offsetof()
"#include \"TypeDictionary.hh\"\n"
"#include \"EnumDataType.hh\"\n"
"#include \"CompositeDataType.hh\"\n"
"\n";
}
std::string PrintFileContents13::enumeration_identifier( EnumValues * e ) {
std::ostringstream oss;
EnumValues::NamespaceIterator nsi ;
for ( nsi = e->namespace_begin() ; nsi != e->namespace_end() ; nsi++ ) {
oss << *nsi << "__" ;
}
EnumValues::ContainerClassIterator ci ;
for ( ci = e->container_class_begin() ; ci != e->container_class_end() ; ci++ ) {
oss << *ci << "__" ;
}
oss << e->getName();
return oss.str();
}
/** Prints enumeration attributes */
void PrintFileContents13::print_enum_attr(std::ostream & ostream , EnumValues * e ) {
EnumValues::NameValueIterator nvit ;
ostream << "class type_" << enumeration_identifier(e) << " {\n"
<< "public:\n"
<< " type_" << enumeration_identifier(e) << "() {\n"
<< " TypeDictionary * type_dict = TypeDictionary::getInstance();\n"
<< " EnumDataType * dataType = new EnumDataType( sizeof(enum " << e->getName() << "));\n"
<< " try {\n"
;
for ( nvit = e->begin() ; nvit != e->end() ; nvit++ ) {
ostream << " dataType->addEnumerator(\"" << (*nvit).first << "\" , " << (*nvit).second << ");\n" ;
}
ostream << " typeDictionary->addTypeDefinition( \"" << e->getName() << "\", dataType );\n"
<< " } catch ( std::logic_error e ) {\n"
<< " std::cerr << e.what();\n"
<< " }\n"
<< " }\n"
<< "};\n"
<< "type_" << enumeration_identifier(e) << " __" << enumeration_identifier(e) << ";\n"
<< "\n"
;
}
/** */
std::string PrintFileContents13::class_identifier( ClassValues * c ) {
std::ostringstream oss;
ClassValues::NamespaceIterator nsi ;
for ( nsi = c->namespace_begin() ; nsi != c->namespace_end() ; nsi++ ) {
oss << *nsi << "__" ;
}
ClassValues::ContainerClassIterator ci ;
for ( ci = c->container_class_begin() ; ci != c->container_class_end() ; ci++ ) {
oss << *ci << "__" ;
}
oss << c->getName();
return oss.str();
}
std::string PrintFileContents13::bit_field_getter_name(ClassValues * c, FieldDescription * f) {
std::ostringstream oss;
oss << " get_" << class_identifier(c) << "__" << f->getName();
return oss.str();
}
std::string PrintFileContents13::bit_field_setter_name(ClassValues * c, FieldDescription * f) {
std::ostringstream oss;
oss << " set_" << class_identifier(c) << "__" << f->getName();
return oss.str();
}
/** Prints attributes for a field */
void PrintFileContents13::print_field_attr(std::ostream & ostream , ClassValues * c, FieldDescription * fv ) {
if (fv->isBitField()) {
ostream << " " ;
ostream << "dataType->addBitFieldMember(\"" << fv->getName() << "\", "
<< bit_field_getter_name(c,fv) << ", "
<< bit_field_setter_name(c,fv) << ");\n"
;
} else {
int ndims = fv->getNumDims();
// For arrays and/or pointers, generate a dimension-size array.
if (ndims) {
ostream << " " ;
ostream << "unsigned int dim_" << fv->getName() << "[] = {";
for ( unsigned int ii = 0 ; ii < ndims ; ii++ ) {
if (ii) {
ostream << ",";
}
ostream << fv->getArrayDim(ii) ;
}
ostream << "};\n";
}
ostream << " " ;
if (fv->isStatic()) {
ostream << "dataType->addStaticMember( \"";
ostream << fv->getName()
<< "\", &" << c->getName() << "::" << fv->getName() << ", \"" << fv->getTypeName() << "\", ";
} else {
ostream << "dataType->addRegularMember( \"";
ostream << fv->getName() << "\", offsetof(" << c->getName() << ", " << fv->getName() << "), \"" << fv->getTypeName() << "\", ";
}
if (ndims) {
ostream << ndims << ", " << "dim_" << fv->getName() ;
} else {
ostream << "0, NULL" ;
}
ostream <<");\n" ;
}
}
/** Prints class attributes */
void PrintFileContents13::print_class_attr(std::ostream & ostream , ClassValues * c ) {
ClassValues::FieldIterator fit ;
// Create setters and getters for any bitfields we may have.
for ( fit = c->field_begin() ; fit != c->field_end() ; fit++ ) {
FieldDescription * f = *fit;
if ( f->isBitField()) {
// Create bitfield getter.
ostream << "static " << f->getTypeName() << " " << bit_field_getter_name(c,f) << "()(void* addr) {\n"
<< " return ((" << class_identifier(c) << "*)addr)->" << f->getName() << ";\n"
<< "}\n"
;
// Create bitfield setter.
ostream << "static void " << bit_field_setter_name(c,f) << "(void* addr, "<< f->getTypeName() << " v) {\n"
<< " ((" << class_identifier(c) << "*)addr)->" << f->getName() << " = v;\n"
<< "}\n"
;
}
}
ostream << "class type_" << class_identifier(c) << " {\n"
<< "public:\n"
<< " type_" << class_identifier(c) << "() {\n"
<< " TypeDictionary * type_dict = TypeDictionary::getInstance();\n"
<< " CompositeDataType * dataType = new CompositeDataType( sizeof( " << c->getName() << "));\n"
<< " try {\n"
;
for ( fit = c->field_begin() ; fit != c->field_end() ; fit++ ) {
FieldDescription * field = *fit;
if ( determinePrintAttr(c , field) ) {
print_field_attr( ostream, c, field) ;
}
}
ostream << " typeDictionary->addTypeDefinition( \"" << c->getName() << "\", dataType );\n"
<< " } catch ( std::logic_error e ) {\n"
<< " std::cerr << e.what();\n"
<< " }\n"
<< " }\n"
<< "};\n"
<< "type_" << class_identifier(c) << " __" << class_identifier(c) << ";\n\n"
;
}
/** Prints io_src for a class */
void PrintFileContents13::printClass( std::ostream & ostream , ClassValues * cv ) {
print_class_attr(ostream, cv) ;
}
/** Prints io_src for an enum */
void PrintFileContents13::printEnum( std::ostream & ostream , EnumValues * ev ) {
print_enum_attr(ostream, ev) ;
}

View File

@ -1,58 +0,0 @@
#ifndef PRINTFILECONTENTS13_HH
#define PRINTFILECONTENTS13_HH
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <set>
#include "PrintFileContentsBase.hh"
/**
This class prints Trick 13 style io_src code. The print command is called when
the container class has added all of the classes and enumerations to this class
to print.
@author somebody
@date July 2012
*/
class PrintFileContents13 : public PrintFileContentsBase {
public:
PrintFileContents13() ;
/** Prints the io_src header information */
virtual void printIOHeader(std::ostream & ostream , std::string header_file_name) ;
std::string enumeration_identifier( EnumValues * e );
/** Prints enumeration attributes */
void print_enum_attr(std::ostream & ostream , EnumValues * in_enum) ;
std::string bit_field_getter_name(ClassValues * c, FieldDescription * f);
std::string bit_field_setter_name(ClassValues * c, FieldDescription * f);
std::string class_identifier( ClassValues * c ) ;
/** Prints attributes for a field */
void print_field_attr(std::ostream & ostream , ClassValues * c, FieldDescription * fv ) ;
/** Prints class attributes */
void print_class_attr(std::ostream & ostream , ClassValues * in_class) ;
/** Prints attributes for a class */
virtual void printClass(std::ostream & ostream , ClassValues * cv) ;
/** Prints attributes for an enum */
virtual void printEnum(std::ostream & ostream , EnumValues * ev) ;
} ;
#endif

View File

@ -26,41 +26,22 @@ void PrintFileContentsBase::printEnumMap(std::ostream & ostream, EnumValues * ev
void PrintFileContentsBase::printEnumMapFooter(std::ostream & ostream) {}
void PrintFileContentsBase::print_units_map(std::ostream & ostream, ClassValues * cv ) {
ClassValues::FieldIterator fit ;
unsigned int ii ;
const std::string name = cv->getFullyQualifiedMangledTypeName("__");
ostream << "struct UnitsMap" << name << " {\n" ;
ostream << "struct UnitsMap" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << " {\n" ;
std::ostringstream text;
for ( fit = cv->field_begin() ; fit != cv->field_end() ; fit++ ) {
if ( determinePrintAttr(cv , *fit) and (*fit)->getUnits().compare("1")) {
FieldDescription * fdes = *fit ;
text << " units_map_ptr->add_param(\"" ;
printContainerClasses( text, cv , "__" ) ;
text << cv->getName() << "_" << fdes->getName() << "\", \"" << fdes->getUnits() << "\") ;\n" ;
auto fields = getPrintableFields(*cv);
if (fields.size()) {
ostream << " UnitsMap" << name << "() {\n"
<< " Trick::UnitsMap* units_map_ptr = Trick::UnitsMap::units_map();\n" ;
for (auto& field : fields) {
ostream << " units_map_ptr->add_param(\"" ;
cv->printContainerClasses(ostream, "__");
ostream << cv->getName() << "_" << field->getName() << "\", \"" << field->getUnits() << "\") ;\n" ;
}
}
if (text.str().size()) {
ostream << " UnitsMap" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << "() {\n" ;
ostream << " Trick::UnitsMap * units_map_ptr = Trick::UnitsMap::units_map() ;\n" ;
ostream << text.str() ;
ostream << " }\n" ;
}
ostream << "} um" ;
printNamespaces( ostream, cv , "__" ) ;
printContainerClasses( ostream, cv , "__" ) ;
ostream << cv->getMangledTypeName() ;
ostream << " ;\n" ;
ostream << "} um" << name << ";\n" ;
}
/* Utility routines for printing */
@ -103,31 +84,13 @@ bool PrintFileContentsBase::determinePrintAttr( ClassValues * c , FieldDescripti
return false ;
}
/** Prints namespace containers of a class delimited by delim */
void PrintFileContentsBase::printNamespaces( std::ostream & ostream , ConstructValues * c , const char * delim ) {
for ( ClassValues::NamespaceIterator nsi = c->namespace_begin() ; nsi != c->namespace_end() ; ++nsi ) {
ostream << *nsi << delim ;
}
}
/** Prints namespace open block */
void PrintFileContentsBase::printOpenNamespaceBlocks( std::ostream & ostream , ClassValues * c ) {
for ( ClassValues::NamespaceIterator nsi = c->namespace_begin() ; nsi != c->namespace_end() ; ++nsi ) {
ostream << "namespace " << *nsi << " {\n" ;
}
}
/** Prints namespace close block */
void PrintFileContentsBase::printCloseNamespaceBlocks( std::ostream & ostream , ClassValues * c ) {
for ( ClassValues::NamespaceIterator nsi = c->namespace_begin() ; nsi != c->namespace_end() ; ++nsi ) {
ostream << "}\n" ;
}
}
/** Prints class containers of a class delimited by delim */
void PrintFileContentsBase::printContainerClasses( std::ostream & ostream , ConstructValues * c , const char * delim ) {
for ( ClassValues::ContainerClassIterator ci = c->container_class_begin() ; ci != c->container_class_end() ; ci++ ) {
ostream << *ci << delim ;
std::vector<FieldDescription*> PrintFileContentsBase::getPrintableFields(ClassValues& classValues) {
std::vector<FieldDescription*> results;
for (auto& field : classValues.getFieldDescriptions()) {
if (determinePrintAttr(&classValues, field) and field->getUnits().compare("1")) {
results.push_back(field);
}
}
return results;
}

View File

@ -55,21 +55,8 @@ class PrintFileContentsBase {
/* internal function determines if a particular field is printable */
bool determinePrintAttr(ClassValues * c , FieldDescription *fdes) ;
/** Prints namespace containers of a class delimited by delim */
void printNamespaces(std::ostream & ostream, ConstructValues * c , const char * delim ) ;
/** Prints namespace open block */
void printOpenNamespaceBlocks( std::ostream & ostream, ClassValues * c ) ;
/** Prints namespace close block */
void printCloseNamespaceBlocks( std::ostream & ostream, ClassValues * c ) ;
/* Note: There are no open/close namespace blocks for enums. The
enum attributes do not have anything that needs to be enclosed in
namespaces */
/** Prints class containers of a class delimited by delim */
void printContainerClasses(std::ostream & ostream, ConstructValues * c , const char * delim ) ;
/* gets a vector of fields that can be printed */
std::vector<FieldDescription*> getPrintableFields(ClassValues& classValues);
} ;

View File

@ -107,20 +107,19 @@ bool TypedefVisitor::VisitTemplateSpecializationType(clang::TemplateSpecializati
CXXRecordVisitor cvis(ci, cs, hsd, pa, true) ;
cvis.TraverseCXXRecordDecl(clang::cast<clang::CXXRecordDecl>(td)) ;
cval = cvis.get_class_data() ;
// Check to see if this typedef is to a STL. If it is we don't want it.
if ((cval->namespace_begin() == cval->namespace_end()) or
(cval->namespace_begin() != cval->namespace_end() and cval->namespace_begin()->compare("std")) ) {
if (cval->isInStandardNamespace()) {
if ( debug_level >= 4 ) {
std::cout << "\nTypedefVisitor VisitTemplateSpecializationType not adding class" << std::endl ;
}
cval = NULL ;
} else {
cval->setName(typedef_name) ;
cval->clearNamespacesAndClasses() ;
cval->getNamespacesAndClasses(typedef_decl_context) ;
// Set the filename of the typedeffed target to the file where the typedef is.
cval->setFileName(getFileName( ci , typedef_location.getBegin() , hsd )) ;
pa.printClass(cval) ;
} else {
if ( debug_level >=4 ) {
std::cout << "\nTypedefVisitor VisitTemplateSpecializationType not adding class" << std::endl ;
}
cval = NULL ;
}
}

View File

@ -60,10 +60,13 @@ bool VariableVisitor::VisitTemplateSpecializationType(clang::TemplateSpecializat
CXXRecordVisitor cvis(ci, cs, hsd, pa, true) ;
cval = cvis.get_class_data() ;
cvis.TraverseCXXRecordDecl(clang::cast<clang::CXXRecordDecl>(td)) ;
// Check to see if this typedef is to a STL. If it is we don't want it.
if ((cval->namespace_begin() == cval->namespace_end()) or
(cval->namespace_begin() != cval->namespace_end() and cval->namespace_begin()->compare("std")) ) {
if (cval->isInStandardNamespace()) {
if ( debug_level >=4 ) {
std::cout << "\nTypedefVisitor VisitTemplateSpecializationType not adding class" << std::endl ;
}
cval = NULL ;
} else {
std::string mangled_name = tst->desugar().getAsString() ;
size_t pos ;
if ((pos = mangled_name.find("class ")) != std::string::npos ) {
@ -81,11 +84,6 @@ bool VariableVisitor::VisitTemplateSpecializationType(clang::TemplateSpecializat
cval->setMangledTypeName(mangled_name) ;
pa.printClass(cval) ;
} else {
if ( debug_level >=4 ) {
std::cout << "\nTypedefVisitor VisitTemplateSpecializationType not adding class" << std::endl ;
}
cval = NULL ;
}
}

View File

@ -22,7 +22,6 @@
#include "CommentSaver.hh"
#include "TranslationUnitVisitor.hh"
#include "PrintAttributes.hh"
#include "PrintAttributesFactory.hh"
#include "Utilities.hh"
/* Command line arguments. These work better as globals, as suggested in llvm/CommandLine documentation */
@ -65,9 +64,9 @@ int main(int argc, char * argv[]) {
*/
llvm::cl::ParseCommandLineOptions(argc, argv);
if (!validAttributesVersion(attr_version)) {
/*if (!validAttributesVersion(attr_version)) {
return -1;
}
}*/
if (input_file_names.empty()) {
std::cerr << "No header file specified" << std::endl;