00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "cppParameterList.h"
00021 #include "cppInstance.h"
00022
00023
00024
00025
00026
00027
00028 CPPParameterList::
00029 CPPParameterList() {
00030 _includes_ellipsis = false;
00031 }
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041 bool CPPParameterList::
00042 is_equivalent(const CPPParameterList &other) const {
00043 if (_includes_ellipsis != other._includes_ellipsis) {
00044 return false;
00045 }
00046 if (_parameters.size() != other._parameters.size()) {
00047 return false;
00048 }
00049 for (int i = 0; i < (int)_parameters.size(); i++) {
00050 if (!_parameters[i]->_type->is_equivalent(*other._parameters[i]->_type)) {
00051 return false;
00052 }
00053 }
00054 return true;
00055 }
00056
00057
00058
00059
00060
00061
00062 bool CPPParameterList::
00063 operator == (const CPPParameterList &other) const {
00064 if (_includes_ellipsis != other._includes_ellipsis) {
00065 return false;
00066 }
00067 if (_parameters.size() != other._parameters.size()) {
00068 return false;
00069 }
00070 for (int i = 0; i < (int)_parameters.size(); i++) {
00071 if (*_parameters[i] != *other._parameters[i]) {
00072 return false;
00073 }
00074 }
00075 return true;
00076 }
00077
00078
00079
00080
00081
00082
00083 bool CPPParameterList::
00084 operator != (const CPPParameterList &other) const {
00085 return !(*this == other);
00086 }
00087
00088
00089
00090
00091
00092
00093 bool CPPParameterList::
00094 operator < (const CPPParameterList &other) const {
00095 if (_includes_ellipsis != other._includes_ellipsis) {
00096 return _includes_ellipsis < other._includes_ellipsis;
00097 }
00098 if (_parameters.size() != other._parameters.size()) {
00099 return _parameters.size() < other._parameters.size();
00100 }
00101 for (int i = 0; i < (int)_parameters.size(); i++) {
00102 if (*_parameters[i] != *other._parameters[i]) {
00103 return *_parameters[i] < *other._parameters[i];
00104 }
00105 }
00106 return false;
00107 }
00108
00109
00110
00111
00112
00113
00114
00115 bool CPPParameterList::
00116 is_tbd() const {
00117 for (int i = 0; i < (int)_parameters.size(); i++) {
00118 if (_parameters[i]->_type->is_tbd()) {
00119 return true;
00120 }
00121 }
00122 return false;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133 bool CPPParameterList::
00134 is_fully_specified() const {
00135 for (int i = 0; i < (int)_parameters.size(); i++) {
00136 if (!_parameters[i]->is_fully_specified()) {
00137 return false;
00138 }
00139 }
00140
00141 return true;
00142 }
00143
00144
00145
00146
00147
00148
00149 CPPParameterList *CPPParameterList::
00150 substitute_decl(CPPDeclaration::SubstDecl &subst,
00151 CPPScope *current_scope, CPPScope *global_scope) {
00152 CPPParameterList *rep = new CPPParameterList;
00153 bool any_changed = false;
00154 for (int i = 0; i < (int)_parameters.size(); i++) {
00155 CPPInstance *inst =
00156 _parameters[i]->substitute_decl(subst, current_scope, global_scope)
00157 ->as_instance();
00158 if (inst != _parameters[i]) {
00159 any_changed = true;
00160 }
00161 rep->_parameters.push_back(inst);
00162 }
00163
00164 if (!any_changed) {
00165 delete rep;
00166 rep = this;
00167 }
00168 return rep;
00169 }
00170
00171
00172
00173
00174
00175
00176
00177
00178 CPPParameterList *CPPParameterList::
00179 resolve_type(CPPScope *current_scope, CPPScope *global_scope) {
00180 CPPParameterList *rep = new CPPParameterList;
00181 bool any_changed = false;
00182 for (int i = 0; i < (int)_parameters.size(); i++) {
00183 CPPInstance *inst = _parameters[i];
00184 CPPType *new_type = inst->_type;
00185 if (new_type->is_tbd()) {
00186 new_type = new_type->resolve_type(current_scope, global_scope);
00187 }
00188
00189 if (new_type != inst->_type) {
00190 any_changed = true;
00191 CPPInstance *new_inst = new CPPInstance(*inst);
00192 new_inst->_type = new_type;
00193 rep->_parameters.push_back(new_inst);
00194 } else {
00195 rep->_parameters.push_back(inst);
00196 }
00197 }
00198
00199 if (!any_changed) {
00200 delete rep;
00201 rep = this;
00202 }
00203 return rep;
00204 }
00205
00206
00207
00208
00209
00210
00211
00212
00213 void CPPParameterList::
00214 output(ostream &out, CPPScope *scope, bool parameter_names,
00215 int num_default_parameters) const {
00216 if (!_parameters.empty()) {
00217 for (int i = 0; i < (int)_parameters.size(); i++) {
00218 if (i != 0) {
00219 out << ", ";
00220 }
00221
00222
00223
00224 CPPExpression *expr = _parameters[i]->_initializer;
00225
00226 if (num_default_parameters >= 0 &&
00227 i < (int)_parameters.size() - num_default_parameters) {
00228
00229 _parameters[i]->_initializer = (CPPExpression *)NULL;
00230 }
00231
00232 if (parameter_names) {
00233 _parameters[i]->output(out, 0, scope, false);
00234 } else {
00235 _parameters[i]->_type->output(out, 0, scope, false);
00236 }
00237
00238
00239 _parameters[i]->_initializer = expr;
00240 }
00241 if (_includes_ellipsis) {
00242 out << ", ...";
00243 }
00244
00245 } else if (_includes_ellipsis) {
00246 out << "...";
00247
00248 } else {
00249
00250 out << "void";
00251 }
00252 }