source: src/SynTree/Initializer.cc@ 871cdb4

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since 871cdb4 was d82daa1, checked in by Peter A. Buhr <pabuhr@…>, 8 years ago

generalize format code for printing size_t items

  • Property mode set to 100644
File size: 5.1 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// Initializer.cc --
8//
9// Author : Richard C. Bilson
10// Created On : Mon May 18 07:44:20 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Mon Aug 21 09:53:15 2017
13// Update Count : 30
14//
15
16#include "Initializer.h"
17
18#include <cassert> // for assertf
19#include <ostream> // for ostream, operator<<, basic_ostream
20#include <string> // for operator<<, string, char_traits
21
22#include "Common/utility.h" // for maybeClone, cloneAll, deleteAll
23#include "Expression.h" // for Expression
24#include "Statement.h" // for Statement
25#include "SynTree/BaseSyntaxNode.h" // for BaseSyntaxNode
26
27Designation::Designation( const std::list< Expression * > & designators ) : designators( designators ) {}
28Designation::Designation( const Designation & other ) : BaseSyntaxNode( other ) {
29 // std::cerr << "cloning designation" << std::endl;
30 cloneAll( other.designators, designators );
31 // std::cerr << "finished cloning designation" << std::endl;
32}
33
34Designation::~Designation() {
35 // std::cerr << "destroying designation" << std::endl;
36 deleteAll( designators );
37 // std::cerr << "finished destroying designation" << std::endl;
38}
39
40void Designation::print( std::ostream &os, int indent ) const {
41 if ( ! designators.empty() ) {
42 os << std::string(indent + 2, ' ' ) << "designated by: " << std::endl;
43 for ( std::list < Expression * >::const_iterator i = designators.begin(); i != designators.end(); i++ ) {
44 os << std::string(indent + 4, ' ' );
45 ( *i )->print(os, indent + 4 );
46 }
47 os << std::endl;
48 } // if
49}
50
51Initializer::Initializer( bool maybeConstructed ) : maybeConstructed( maybeConstructed ) {}
52Initializer::Initializer( const Initializer & other ) : BaseSyntaxNode( other ), maybeConstructed( other.maybeConstructed ) {
53}
54Initializer::~Initializer() {}
55
56SingleInit::SingleInit( Expression *v, bool maybeConstructed ) : Initializer( maybeConstructed ), value ( v ) {
57}
58
59SingleInit::SingleInit( const SingleInit &other ) : Initializer(other), value ( maybeClone( other.value ) ) {
60}
61
62SingleInit::~SingleInit() {
63 delete value;
64}
65
66void SingleInit::print( std::ostream &os, int indent ) const {
67 os << std::string(indent, ' ' ) << "Simple Initializer: " << std::endl;
68 os << std::string(indent+4, ' ' );
69 value->print( os, indent+4 );
70}
71
72
73ListInit::ListInit( const std::list<Initializer*> &inits, const std::list<Designation *> &des, bool maybeConstructed )
74 : Initializer( maybeConstructed ), initializers( inits ), designations( des ) {
75 // handle the common case where a ListInit is created without designations by making a list of empty designations with the same length as the initializer
76 if ( designations.empty() ) {
77 for ( auto & i : initializers ) {
78 (void)i;
79 designations.push_back( new Designation( {} ) );
80 }
81 }
82 assertf( initializers.size() == designations.size(), "Created ListInit with mismatching initializers (%zd) and designations (%zd)", initializers.size(), designations.size() );
83}
84
85ListInit::ListInit( const ListInit & other ) : Initializer( other ) {
86 cloneAll( other.initializers, initializers );
87 cloneAll( other.designations, designations );
88}
89
90ListInit::~ListInit() {
91 deleteAll( initializers );
92 deleteAll( designations );
93}
94
95void ListInit::print( std::ostream &os, int indent ) const {
96 os << std::string(indent, ' ') << "Compound initializer: " << std::endl;
97 for ( Designation * d : designations ) {
98 d->print( os, indent + 2 );
99 }
100
101 for ( const Initializer * init : initializers ) {
102 init->print( os, indent + 2 );
103 os << std::endl;
104 }
105}
106
107
108ConstructorInit::ConstructorInit( Statement * ctor, Statement * dtor, Initializer * init ) : Initializer( true ), ctor( ctor ), dtor( dtor ), init( init ) {}
109ConstructorInit::ConstructorInit( const ConstructorInit &other ) : Initializer( other ), ctor( maybeClone( other.ctor ) ), dtor( maybeClone( other.dtor ) ), init( maybeClone( other.init ) ) {
110}
111
112ConstructorInit::~ConstructorInit() {
113 delete ctor;
114 delete dtor;
115 delete init;
116}
117
118void ConstructorInit::print( std::ostream &os, int indent ) const {
119 os << std::endl << std::string(indent, ' ') << "Constructor initializer: " << std::endl;
120 if ( ctor ) {
121 os << std::string(indent+2, ' ');
122 os << "initially constructed with ";
123 ctor->print( os, indent+4 );
124 } // if
125
126 if ( dtor ) {
127 os << std::string(indent+2, ' ');
128 os << "destructed with ";
129 dtor->print( os, indent+4 );
130 }
131
132 if ( init ) {
133 os << std::string(indent+2, ' ');
134 os << "with fallback C-style initializer: ";
135 init->print( os, indent+4 );
136 }
137}
138
139std::ostream & operator<<( std::ostream & out, const Initializer * init ) {
140 if ( init ) {
141 init->print( out );
142 } else {
143 out << "nullptr";
144 }
145 return out;
146}
147
148std::ostream & operator<<( std::ostream & out, const Designation * des ) {
149 if ( des ) {
150 des->print( out );
151 } else {
152 out << "nullptr";
153 }
154 return out;
155}
156
157// Local Variables: //
158// tab-width: 4 //
159// mode: c++ //
160// compile-command: "make install" //
161// End: //
Note: See TracBrowser for help on using the repository browser.