1 /******************************************************************************
2 * Copyright (c) 2000-2016 Ericsson Telecom AB
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
17 * Szabo, Janos Zoltan – initial implementation
20 ******************************************************************************/
21 #include "../../common/dbgnew.hh"
22 #include "Templatestuff.hh"
23 #include "../Identifier.hh"
24 #include "TtcnTemplate.hh"
25 #include "ArrayDimensions.hh"
31 // =================================
33 // =================================
35 ValueRange::~ValueRange()
41 ValueRange
*ValueRange::clone() const
43 return new ValueRange(*this);
46 ValueRange::ValueRange(const ValueRange
& other
)
48 , min_v(other
.min_v
? other
.min_v
->clone() : 0)
49 , max_v(other
.max_v
? other
.max_v
->clone() : 0)
52 void ValueRange::set_fullname(const string
& p_fullname
)
54 Node::set_fullname(p_fullname
);
55 if (min_v
) min_v
->set_fullname(p_fullname
+ ".<lower_bound>");
56 if (max_v
) max_v
->set_fullname(p_fullname
+ ".<upper_bound>");
59 void ValueRange::set_my_scope(Scope
*p_scope
)
61 Node::set_my_scope(p_scope
);
62 if (min_v
) min_v
->set_my_scope(p_scope
);
63 if (max_v
) max_v
->set_my_scope(p_scope
);
66 void ValueRange::set_lowerid_to_ref()
68 if (min_v
) min_v
->set_lowerid_to_ref();
69 if (max_v
) max_v
->set_lowerid_to_ref();
72 Type::typetype_t
ValueRange::get_expr_returntype(
73 Type::expected_value_t exp_val
)
76 Type::typetype_t tt
= min_v
->get_expr_returntype(exp_val
);
77 if (tt
!= Type::T_UNDEF
) return tt
;
80 Type::typetype_t tt
= max_v
->get_expr_returntype(exp_val
);
81 if (tt
!= Type::T_UNDEF
) return tt
;
86 Type
*ValueRange::get_expr_governor(Type::expected_value_t exp_val
)
89 Type
*t
= min_v
->get_expr_governor(exp_val
);
93 Type
*t
= max_v
->get_expr_governor(exp_val
);
99 void ValueRange::set_code_section
100 (GovernedSimple::code_section_t p_code_section
)
102 if (min_v
) min_v
->set_code_section(p_code_section
);
103 if (max_v
) max_v
->set_code_section(p_code_section
);
106 char *ValueRange::generate_code_init(char *str
, const char *name
)
108 expression_struct expr
;
109 Code::init_expr(&expr
);
110 char *init_stmt
= mprintf("%s.set_type(VALUE_RANGE);\n", name
);
112 min_v
->generate_code_expr(&expr
);
113 init_stmt
= mputprintf(init_stmt
, "%s.set_min(%s);\n", name
, expr
.expr
);
116 Code::clean_expr(&expr
);
117 max_v
->generate_code_expr(&expr
);
118 init_stmt
= mputprintf(init_stmt
, "%s.set_max(%s);\n", name
, expr
.expr
);
120 if (expr
.preamble
|| expr
.postamble
) {
121 str
= mputstr(str
, "{\n");
122 str
= mputstr(str
, expr
.preamble
);
123 str
= mputstr(str
, init_stmt
);
124 str
= mputstr(str
, expr
.postamble
);
125 str
= mputstr(str
, "}\n");
126 } else str
= mputstr(str
, init_stmt
);
127 Code::free_expr(&expr
);
132 char *ValueRange::rearrange_init_code(char *str
, Common::Module
* usage_mod
)
134 if (min_v
) str
= min_v
->rearrange_init_code(str
, usage_mod
);
135 if (max_v
) str
= max_v
->rearrange_init_code(str
, usage_mod
);
139 void ValueRange::append_stringRepr(string
& str
) const
142 if (min_v
) str
+= min_v
->get_stringRepr();
143 else str
+= "-infinity";
145 if (max_v
) str
+= max_v
->get_stringRepr();
146 else str
+= "infinity";
150 void ValueRange::dump(unsigned level
) const
153 if (min_v
) min_v
->dump(level
+ 1);
154 else DEBUG(level
+ 1, "-infinity");
155 DEBUG(level
+ 1, "..");
156 if (max_v
) max_v
->dump(level
+ 1);
157 else DEBUG(level
+ 1, "infinity");
161 // =================================
163 // =================================
165 Templates::~Templates()
167 for (size_t i
= 0; i
< ts
.size(); i
++) delete ts
[i
];
171 Templates::Templates(const Templates
& other
)
174 for (size_t i
= 0, lim
= other
.ts
.size(); i
< lim
; ++i
) {
175 ts
.add(other
.ts
[i
]->clone());
179 Templates
*Templates::clone() const
181 return new Templates(*this);
184 void Templates::set_my_scope(Scope
*p_scope
)
186 for (size_t i
= 0; i
< ts
.size(); i
++) ts
[i
]->set_my_scope(p_scope
);
189 void Templates::add_t(Template
*p_t
)
191 if (!p_t
) FATAL_ERROR("NULL pointer:Templates::add_t()");
195 void Templates::add_front_t(Template
*p_t
)
197 if (!p_t
) FATAL_ERROR("NULL pointer:Templates::add_front_t()");
201 void Templates::append_stringRepr(string
& str
) const
203 for (size_t i
= 0; i
< ts
.size(); i
++) {
204 if (i
> 0) str
+= ", ";
205 str
+= ts
[i
]->get_stringRepr();
209 // =================================
210 // ===== IndexedTemplate
211 // =================================
213 IndexedTemplate::IndexedTemplate(const IndexedTemplate
& p
)
215 index
= p
.index
->clone();
216 temp
= p
.temp
->clone();
219 IndexedTemplate::IndexedTemplate(FieldOrArrayRef
*p_i
, Template
*p_t
)
221 if (!p_i
|| !p_t
) FATAL_ERROR("IndexedTemplate::IndexedTemplate()");
226 IndexedTemplate::~IndexedTemplate()
232 IndexedTemplate
*IndexedTemplate::clone() const
234 return new IndexedTemplate(*this);
237 void IndexedTemplate::set_fullname(const string
& p_fullname
)
239 Node::set_fullname(p_fullname
);
240 temp
->set_fullname(p_fullname
);
241 index
->set_fullname(p_fullname
);
244 void IndexedTemplate::set_my_scope(Scope
*p_scope
)
246 Node::set_my_scope(p_scope
);
247 temp
->set_my_scope(p_scope
);
248 index
->set_my_scope(p_scope
);
251 void IndexedTemplate::set_code_section
252 (GovernedSimple::code_section_t p_code_section
)
254 index
->get_val()->set_code_section(p_code_section
);
255 temp
->set_code_section(p_code_section
);
258 void IndexedTemplate::dump(unsigned level
) const
264 // =================================
265 // ===== IndexedTemplates
266 // =================================
268 IndexedTemplates::IndexedTemplates(const IndexedTemplates
& p
)
271 for (size_t i
= 0; i
< p
.its_v
.size(); i
++) {
272 its_v
.add(p
.its_v
[i
]->clone());
276 IndexedTemplates::~IndexedTemplates()
278 for (size_t i
= 0; i
< its_v
.size(); i
++) delete its_v
[i
];
282 IndexedTemplates
*IndexedTemplates::clone() const
284 return new IndexedTemplates(*this);
287 void IndexedTemplates::set_fullname(const string
& p_fullname
)
289 Node::set_fullname(p_fullname
);
290 for(size_t i
= 0; i
< its_v
.size(); i
++) {
291 IndexedTemplate
*it
= its_v
[i
];
292 string t_fullname
= p_fullname
;
293 (it
->get_index()).append_stringRepr(t_fullname
);
294 it
->set_fullname(t_fullname
);
298 void IndexedTemplates::set_my_scope(Scope
*p_scope
)
300 Node::set_my_scope(p_scope
);
301 for (size_t i
= 0; i
< its_v
.size(); i
++)
302 its_v
[i
]->set_my_scope(p_scope
);
305 void IndexedTemplates::add_it(IndexedTemplate
*p_it
)
307 if (!p_it
) FATAL_ERROR("NULL pointer: IndexedTemplates::add_it()");
311 IndexedTemplate
*IndexedTemplates::get_it_byIndex(size_t p_i
)
316 // =================================
317 // ===== NamedTemplate
318 // =================================
320 NamedTemplate::NamedTemplate(Identifier
*p_n
, Template
*p_t
)
322 if (!p_n
|| !p_t
) FATAL_ERROR("NamedTemplate::NamedTemplate()");
327 NamedTemplate::NamedTemplate(const NamedTemplate
& p
)
329 name
= p
.name
->clone();
330 temp
= p
.temp
->clone();
333 NamedTemplate::~NamedTemplate()
339 NamedTemplate
*NamedTemplate::clone() const
341 return new NamedTemplate(*this);
344 void NamedTemplate::set_fullname(const string
& p_fullname
)
346 Node::set_fullname(p_fullname
);
347 temp
->set_fullname(p_fullname
);
350 void NamedTemplate::set_my_scope(Scope
*p_scope
)
352 Node::set_my_scope(p_scope
);
353 temp
->set_my_scope(p_scope
);
356 void NamedTemplate::set_name_to_lowercase()
358 string new_name
= name
->get_name();
359 if (isupper(new_name
[0])) {
360 new_name
[0] = tolower(new_name
[0]);
361 if (new_name
[new_name
.size() - 1] == '_') {
362 // an underscore is inserted at the end of the alternative name if it's
363 // a basic type's name (since it would conflict with the class generated
365 // remove the underscore, it won't conflict with anything if its name
366 // starts with a lowercase letter
367 new_name
.replace(new_name
.size() - 1, 1, "");
370 name
= new Identifier(Identifier::ID_NAME
, new_name
);
374 Template
* NamedTemplate::extract_template()
376 Template
* ret
= temp
;
381 void NamedTemplate::dump(unsigned level
) const
387 // =================================
388 // ===== NamedTemplates
389 // =================================
391 NamedTemplates::NamedTemplates(const NamedTemplates
& p
)
392 : Node(p
), checked(p
.checked
)
394 for (size_t i
= 0; i
< p
.nts_v
.size(); i
++) {
395 NamedTemplate
* nt
= p
.nts_v
[i
]->clone();
398 nts_m
.add(p
.nts_m
.get_nth_key(i
), nt
);
403 NamedTemplates::~NamedTemplates()
405 for (size_t i
= 0; i
< nts_v
.size(); i
++) delete nts_v
[i
];
410 NamedTemplates
*NamedTemplates::clone() const
412 return new NamedTemplates(*this);
415 void NamedTemplates::set_fullname(const string
& p_fullname
)
417 Node::set_fullname(p_fullname
);
418 for(size_t i
= 0; i
< nts_v
.size(); i
++) {
419 NamedTemplate
*nt
= nts_v
[i
];
420 nt
->set_fullname(p_fullname
+ "." + nt
->get_name().get_dispname());
424 void NamedTemplates::set_my_scope(Scope
*p_scope
)
426 Node::set_my_scope(p_scope
);
427 for(size_t i
= 0; i
< nts_v
.size(); i
++) nts_v
[i
]->set_my_scope(p_scope
);
430 void NamedTemplates::add_nt(NamedTemplate
*p_nt
)
432 if (!p_nt
) FATAL_ERROR("NULL pointer:NamedTemplates::add_nt()");
435 const string
& name
= p_nt
->get_name().get_name();
436 if (!nts_m
.has_key(name
)) nts_m
.add(name
, p_nt
);
440 bool NamedTemplates::has_nt_withName(const Identifier
& p_name
)
442 if (!checked
) chk_dupl_id(false);
443 return nts_m
.has_key(p_name
.get_name());
446 NamedTemplate
*NamedTemplates::get_nt_byName(const Identifier
& p_name
)
448 if (!checked
) chk_dupl_id(false);
449 return nts_m
[p_name
.get_name()];
452 void NamedTemplates::chk_dupl_id(bool report_errors
)
454 if (checked
) nts_m
.clear();
455 for (size_t i
= 0; i
< nts_v
.size(); i
++) {
456 NamedTemplate
*nt
= nts_v
[i
];
457 const Identifier
& id
= nt
->get_name();
458 const string
& name
= id
.get_name();
459 if (!nts_m
.has_key(name
)) nts_m
.add(name
, nt
);
460 else if (report_errors
) {
461 const char *disp_name
= id
.get_dispname().c_str();
462 nt
->error("Duplicate field name `%s'", disp_name
);
463 nts_m
[name
]->note("Field `%s' is already given here", disp_name
);
469 // =================================
470 // ===== LengthRestriction
471 // =================================
473 LengthRestriction::LengthRestriction(Value
* p_val
)
474 : Node(), checked(false), is_range(false)
477 FATAL_ERROR("LengthRestriction::LengthRestriction()");
481 LengthRestriction::LengthRestriction(Value
* p_lower
, Value
* p_upper
)
482 : Node(), checked(false), is_range(true)
485 FATAL_ERROR("LengthRestriction::LengthRestriction()");
486 range
.lower
= p_lower
;
487 range
.upper
= p_upper
;
490 LengthRestriction::~LengthRestriction()
495 } else delete single
;
498 LengthRestriction
*LengthRestriction::clone() const
500 FATAL_ERROR("LengthRestriction::clone");
503 void LengthRestriction::set_fullname(const string
& p_fullname
)
505 Node::set_fullname(p_fullname
);
507 range
.lower
->set_fullname(p_fullname
+ ".<lower>");
508 if (range
.upper
) range
.upper
->set_fullname(p_fullname
+ ".<upper>");
509 } else single
->set_fullname(p_fullname
);
512 void LengthRestriction::set_my_scope(Scope
*p_scope
)
515 range
.lower
->set_my_scope(p_scope
);
516 if (range
.upper
) range
.upper
->set_my_scope(p_scope
);
517 } else single
->set_my_scope(p_scope
);
520 void LengthRestriction::chk(Type::expected_value_t expected_value
)
524 Type
*pool_int
= Type::get_pooltype(Type::T_INT
);
526 range
.lower
->set_my_governor(pool_int
);
528 Error_Context
cntxt(range
.lower
, "In lower boundary of the length "
530 pool_int
->chk_this_value_ref(range
.lower
);
531 pool_int
->chk_this_value(range
.lower
, 0, expected_value
,
532 INCOMPLETE_NOT_ALLOWED
, OMIT_NOT_ALLOWED
, SUB_CHK
);
534 Value
*v_lower
= range
.lower
->get_value_refd_last();
535 int_val_t v_int_lower_int
;
536 if (v_lower
->get_valuetype() == Value::V_INT
) {
537 v_int_lower_int
= *(v_lower
->get_val_Int());
538 if (v_int_lower_int
< 0) {
539 range
.lower
->error("The lower boundary of the length restriction "
540 "must be a non-negative integer value instead of %s",
541 v_int_lower_int
.t_str().c_str());
542 range
.lower
->set_valuetype(Value::V_ERROR
);
543 v_int_lower_int
= int_val_t((Int
)0);
546 v_int_lower_int
= int_val_t((Int
)0);
549 range
.upper
->set_my_governor(pool_int
);
551 Error_Context
cntxt(range
.lower
, "In upper boundary of the length "
553 pool_int
->chk_this_value_ref(range
.upper
);
554 pool_int
->chk_this_value(range
.upper
, 0, expected_value
,
555 INCOMPLETE_NOT_ALLOWED
, OMIT_NOT_ALLOWED
, SUB_CHK
);
557 Value
*v_upper
= range
.upper
->get_value_refd_last();
558 if (v_upper
->get_valuetype() == Value::V_INT
) {
559 int_val_t
v_int_upper_int(*(v_upper
->get_val_Int()));
560 if (v_int_upper_int
< 0) {
561 range
.upper
->error("The upper boundary of the length "
562 "restriction must be a non-negative integer value instead "
563 "of %s", v_int_upper_int
.t_str().c_str());
564 range
.upper
->set_valuetype(Value::V_ERROR
);
565 } else if (v_int_upper_int
< v_int_lower_int
) {
566 error("The upper boundary of the length restriction (%s) "
567 "cannot be smaller than the lower boundary (%s)",
568 v_int_upper_int
.t_str().c_str(),
569 v_int_lower_int
.t_str().c_str());
570 range
.upper
->set_valuetype(Value::V_ERROR
);
575 single
->set_my_governor(pool_int
);
577 Error_Context
cntxt(single
, "In length restriction");
578 pool_int
->chk_this_value_ref(single
);
579 pool_int
->chk_this_value(single
, 0, expected_value
,
580 INCOMPLETE_NOT_ALLOWED
, OMIT_NOT_ALLOWED
, SUB_CHK
);
582 Value
*v_single
= single
->get_value_refd_last();
583 if (v_single
->get_valuetype() == Value::V_INT
) {
584 const int_val_t
*v_int_int
= v_single
->get_val_Int();
585 if (*v_int_int
< 0) {
586 single
->error("The length restriction must be a non-negative "
587 "integer value instead of %s", (v_int_int
->t_str()).c_str());
588 single
->set_valuetype(Value::V_ERROR
);
594 void LengthRestriction::chk_array_size(ArrayDimension
*p_dim
)
596 if (!checked
) FATAL_ERROR("LengthRestriction::chk_array_size()");
597 bool error_flag
= false;
598 if (!p_dim
->get_has_error()) {
599 size_t array_size
= p_dim
->get_size();
601 Value
*v_lower_last
= range
.lower
->get_value_refd_last();
602 if (v_lower_last
->get_valuetype() == Value::V_INT
) {
603 const int_val_t
*lower_len_int
= v_lower_last
->get_val_Int();
604 if (*lower_len_int
> INT_MAX
) {
605 range
.lower
->error("An integer value less than `%d' was expected "
606 "as the lower boundary of the length restriction instead of "
607 "`%s'", INT_MAX
, (lower_len_int
->t_str()).c_str());
610 Int lower_len
= lower_len_int
->get_val();
611 if (lower_len
> static_cast<Int
>(array_size
)) {
612 range
.lower
->error("The number of elements allowed by the "
613 "length restriction (at least %s) contradicts the array size "
614 "(%lu)", Int2string(lower_len
).c_str(),
615 (unsigned long)array_size
);
621 Value
*v_upper_last
= range
.upper
->get_value_refd_last();
622 if (v_upper_last
->get_valuetype() == Value::V_INT
) {
623 const int_val_t
*upper_len_int
= v_upper_last
->get_val_Int();
624 if (*upper_len_int
> INT_MAX
) {
625 range
.upper
->error("An integer value less than `%d' was "
626 "expected as the upper boundary of the length restriction "
627 "instead of `%s'", INT_MAX
, (upper_len_int
->t_str()).c_str());
630 Int upper_len
= upper_len_int
->get_val();
631 if (upper_len
< static_cast<Int
>(array_size
)) {
632 range
.upper
->error("The number of elements allowed by the "
633 "length restriction (at most %s) contradicts the array "
634 "size (%lu)", Int2string(upper_len
).c_str(),
635 (unsigned long)array_size
);
642 Value
*v_last
= single
->get_value_refd_last();
643 if (v_last
->get_valuetype() == Value::V_INT
) {
644 int_val_t
single_len_int(*(v_last
->get_val_Int()));
645 if (single_len_int
!= static_cast<Int
>(array_size
)) {
646 single
->error("The number of elements allowed by the length "
647 "restriction (%s) contradicts the array size (%lu)",
648 single_len_int
.t_str().c_str(), (unsigned long)array_size
);
655 warning("Length restriction is useless for an array template");
658 void LengthRestriction::chk_nof_elements(size_t nof_elements
,
659 bool has_anyornone
, const Location
& p_loc
, const char *p_what
)
661 if (!checked
) FATAL_ERROR("LengthRestriction::chk_nof_elements()");
663 if (!has_anyornone
) {
664 Value
*v_lower_last
= range
.lower
->get_value_refd_last();
665 if (v_lower_last
->get_valuetype() == Value::V_INT
) {
666 const int_val_t
*lower_len_int
= v_lower_last
->get_val_Int();
667 if (*lower_len_int
> static_cast<Int
>(nof_elements
)) {
668 p_loc
.error("There are fewer (%lu) elements in the %s than it "
669 "is allowed by the length restriction (at least %s)",
670 (unsigned long)nof_elements
, p_what
,
671 (lower_len_int
->t_str()).c_str());
676 Value
*v_upper_last
= range
.upper
->get_value_refd_last();
677 if (v_upper_last
->get_valuetype() == Value::V_INT
) {
678 const int_val_t
*upper_len_int
= v_upper_last
->get_val_Int();
679 if (*upper_len_int
< static_cast<Int
>(nof_elements
)) {
680 p_loc
.error("There are more (%s%lu) elements in the %s than it "
681 "is allowed by the length restriction (at most %s)",
682 has_anyornone
? "at least " : "", (unsigned long)nof_elements
,
683 p_what
, (upper_len_int
->t_str()).c_str());
688 Value
*v_last
= single
->get_value_refd_last();
689 if (v_last
->get_valuetype() == Value::V_INT
) {
690 // Cheaper than creating a local variable?
691 const int_val_t
*single_len_int
= v_last
->get_val_Int();
692 if (*single_len_int
< static_cast<Int
>(nof_elements
)) {
693 p_loc
.error("There are more (%s%lu) elements in the %s than it "
694 "is allowed by the length restriction (%s)", has_anyornone
?
695 "at least " : "", (unsigned long)nof_elements
, p_what
,
696 (single_len_int
->t_str()).c_str());
697 } else if (*single_len_int
> static_cast<Int
>(nof_elements
) &&
699 p_loc
.error("There are fewer (%lu) elements in the %s than it "
700 "is allowed by the length restriction (%s)",
701 (unsigned long)nof_elements
, p_what
,
702 (single_len_int
->t_str()).c_str());
708 Value
* LengthRestriction::get_single_value()
710 if (is_range
) FATAL_ERROR("LengthRestriction::get_single_value()");
711 if (!checked
) FATAL_ERROR("LengthRestriction::get_single_value()");
712 return single
->get_value_refd_last();
715 Value
*LengthRestriction::get_lower_value()
717 if (!is_range
) FATAL_ERROR("LengthRestriction::get_lower_value()");
718 if (!checked
) FATAL_ERROR("LengthRestriction::get_lower_value()");
719 return range
.lower
->get_value_refd_last();
722 Value
*LengthRestriction::get_upper_value()
724 if (!is_range
) FATAL_ERROR("LengthRestriction::get_upper_value()");
725 if (!checked
) FATAL_ERROR("LengthRestriction::get_upper_value()");
726 return range
.upper
? range
.upper
->get_value_refd_last() : 0;
729 void LengthRestriction::set_code_section
730 (GovernedSimple::code_section_t p_code_section
)
733 range
.lower
->set_code_section(p_code_section
);
734 if (range
.upper
) range
.upper
->set_code_section(p_code_section
);
735 } else single
->set_code_section(p_code_section
);
738 char *LengthRestriction::generate_code_init(char *str
, const char *name
)
740 expression_struct expr
;
741 Code::init_expr(&expr
);
744 range
.lower
->generate_code_expr(&expr
);
745 init_stmt
= mprintf("%s.set_min_length(%s);\n", name
, expr
.expr
);
747 Code::clean_expr(&expr
);
748 range
.upper
->generate_code_expr(&expr
);
749 init_stmt
= mputprintf(init_stmt
, "%s.set_max_length(%s);\n", name
,
753 single
->generate_code_expr(&expr
);
754 init_stmt
= mprintf("%s.set_single_length(%s);\n", name
, expr
.expr
);
756 if (expr
.preamble
|| expr
.postamble
) {
757 str
= mputstr(str
, "{\n");
758 str
= mputstr(str
, expr
.preamble
);
759 str
= mputstr(str
, init_stmt
);
760 str
= mputstr(str
, expr
.postamble
);
761 str
= mputstr(str
, "}\n");
762 } else str
= mputstr(str
, init_stmt
);
763 Code::free_expr(&expr
);
768 char *LengthRestriction::rearrange_init_code(char *str
, Common::Module
* usage_mod
)
771 str
= range
.lower
->rearrange_init_code(str
, usage_mod
);
772 if (range
.upper
) str
= range
.upper
->rearrange_init_code(str
, usage_mod
);
773 } else str
= single
->rearrange_init_code(str
, usage_mod
);
777 void LengthRestriction::append_stringRepr(string
& str
) const
781 str
+= range
.lower
->get_stringRepr();
783 if (range
.upper
) str
+= range
.upper
->get_stringRepr();
784 else str
+= "infinity";
785 } else str
+= single
->get_stringRepr();
789 void LengthRestriction::dump(unsigned level
) const
791 DEBUG(level
, "length restriction:");
793 range
.lower
->dump(level
+ 1);
795 if (range
.upper
) range
.upper
->dump(level
+ 1);
796 else DEBUG(level
+ 1, "infinity");
797 } else single
->dump(level
+ 1);
800 // =================================
801 // ===== TemplateInstances
802 // =================================
804 TemplateInstances::TemplateInstances(const TemplateInstances
& p
)
805 : Node(p
), Location(p
), tis()
807 for (size_t i
= 0; i
< p
.tis
.size(); i
++)
808 tis
.add(p
.tis
[i
]->clone());
811 TemplateInstances::~TemplateInstances()
813 for (size_t i
= 0; i
< tis
.size(); i
++) delete tis
[i
];
817 TemplateInstances
*TemplateInstances::clone() const
819 return new TemplateInstances(*this);
822 void TemplateInstances::set_fullname(const string
& p_fullname
)
824 Node::set_fullname(p_fullname
);
825 for (size_t i
= 0; i
< tis
.size(); i
++)
826 tis
[i
]->set_fullname(p_fullname
+ "[" + Int2string(i
+ 1) + "]");
829 void TemplateInstances::set_my_scope(Scope
*p_scope
)
831 for (size_t i
= 0; i
< tis
.size(); i
++)
833 TemplateInstance
*& tir
= tis
[i
];
834 tir
->set_my_scope(p_scope
);
838 void TemplateInstances::add_ti(TemplateInstance
*p_ti
)
840 if (!p_ti
) FATAL_ERROR("NULL pointer:TemplateInstances::add_ti()");
844 void TemplateInstances::set_code_section
845 (GovernedSimple::code_section_t p_code_section
)
847 for (size_t i
=0; i
<tis
.size(); i
++)
848 tis
[i
]->set_code_section(p_code_section
);
851 void TemplateInstances::dump(unsigned level
) const
853 DEBUG(level
, "TemplateInstances %p, has %lu", (const void*)this,
854 (unsigned long) tis
.size());
855 for (size_t i
= 0; i
< tis
.size(); ++i
) {
856 tis
[i
]->dump(level
+1);
859 // =================================
861 // =================================
863 NamedParam::NamedParam(Identifier
*id
, TemplateInstance
*t
)
864 : Node(), Location(), name(id
), tmpl(t
)
868 NamedParam::NamedParam(const NamedParam
& p
)
869 : Node(p
), Location(p
), name(p
.name
->clone()), tmpl(p
.tmpl
->clone())
873 NamedParam::~NamedParam()
879 NamedParam
* NamedParam::clone() const {
880 return new NamedParam(*this);
883 void NamedParam::set_my_scope(Scope
*p_scope
)
885 tmpl
->set_my_scope(p_scope
);
888 void NamedParam::set_fullname(const string
& p_fullname
)
890 Node::set_fullname(p_fullname
);
891 tmpl
->set_fullname(p_fullname
);
894 TemplateInstance
* NamedParam::extract_ti()
896 TemplateInstance
*retval
= tmpl
;
901 void NamedParam::dump(unsigned int level
) const
906 // =================================
908 // =================================
910 NamedParams::NamedParams()
911 : Node(), Location(), nps()
915 NamedParams
* NamedParams::clone() const
917 FATAL_ERROR("NamedParams::clone");
920 NamedParams::~NamedParams()
922 for (size_t i
= 0; i
< nps
.size(); i
++) delete nps
[i
];
926 void NamedParams::set_my_scope(Scope
*p_scope
)
928 for (size_t i
= 0; i
< nps
.size(); i
++) nps
[i
]->set_my_scope(p_scope
);
931 void NamedParams::set_fullname(const string
& p_fullname
)
933 for (size_t i
= 0; i
< nps
.size(); i
++) nps
[i
]->set_fullname(p_fullname
);
936 void NamedParams::add_np(NamedParam
*p
)
938 if (!p
) FATAL_ERROR("NULL pointer: NamedParams::add_np()");
942 size_t NamedParams::get_nof_nps() const
947 NamedParam
*NamedParams::extract_np_byIndex(size_t p_i
)
949 NamedParam
* retval
= nps
[p_i
];
954 void NamedParams::dump(unsigned int level
) const
956 DEBUG(level
, "NamedParams %p, has %lu", (const void*)this,
957 (unsigned long) nps
.size());
958 for (unsigned int i
= 0; i
< nps
.size(); ++i
) {
960 nps
[i
]->dump(level
+1);
962 DEBUG(level
+1, "NULL");
966 // =================================
967 // ===== ParsedActualParameters
968 // =================================
970 ParsedActualParameters::ParsedActualParameters(TemplateInstances
*p_ti
,
972 : Node(), Location(), unnamedpart(p_ti
? p_ti
: new TemplateInstances
), namedpart(p_np
)
976 ParsedActualParameters::ParsedActualParameters(const ParsedActualParameters
& p
)
977 : Node(p
), Location(p
), unnamedpart(p
.unnamedpart
->clone()),
978 namedpart (p
.namedpart
? p
.namedpart
->clone() : 0)
982 ParsedActualParameters
* ParsedActualParameters::clone() const
984 return new ParsedActualParameters(*this);
987 ParsedActualParameters::~ParsedActualParameters()
993 void ParsedActualParameters::add_np(NamedParam
*np
)
995 if (!namedpart
) // we got away without one until now
997 namedpart
= new NamedParams
;
999 namedpart
->add_np(np
);
1002 TemplateInstances
* ParsedActualParameters::steal_tis()
1004 TemplateInstances
* temp
= unnamedpart
;
1005 unnamedpart
= new TemplateInstances
;
1009 size_t ParsedActualParameters::get_nof_nps() const
1011 return namedpart
? namedpart
->get_nof_nps() : 0;
1014 void ParsedActualParameters::set_my_scope(Common::Scope
*p_scope
)
1016 unnamedpart
->set_my_scope(p_scope
);
1018 namedpart
->set_my_scope(p_scope
);
1022 void ParsedActualParameters::set_fullname(const string
& p_fullname
)
1024 unnamedpart
->set_fullname(p_fullname
);
1026 namedpart
->set_fullname(p_fullname
);
1030 void ParsedActualParameters::set_location(const char *p_filename
, int p_lineno
)
1032 Location ::set_location(p_filename
, p_lineno
);
1034 namedpart
->set_location(p_filename
, p_lineno
);
1035 unnamedpart
->set_location(p_filename
, p_lineno
);
1038 void ParsedActualParameters::set_location(const char *p_filename
,
1039 const YYLTYPE
& p_yyloc
)
1041 Location ::set_location(p_filename
, p_yyloc
);
1043 namedpart
->set_location(p_filename
, p_yyloc
);
1044 unnamedpart
->set_location(p_filename
, p_yyloc
);
1047 void ParsedActualParameters::set_location(const char *p_filename
,
1048 const YYLTYPE
& p_firstloc
,
1049 const YYLTYPE
& p_lastloc
)
1051 Location ::set_location(p_filename
, p_firstloc
, p_lastloc
);
1053 namedpart
->set_location(p_filename
, p_firstloc
, p_lastloc
);
1054 unnamedpart
->set_location(p_filename
, p_firstloc
, p_lastloc
);
1057 void ParsedActualParameters::set_location(const char *p_filename
, int p_first_line
,
1058 int p_first_column
, int p_last_line
, int p_last_column
)
1060 Location ::set_location(p_filename
, p_first_line
, p_first_column
,
1061 p_last_line
, p_last_column
);
1063 namedpart
->set_location(p_filename
, p_first_line
, p_first_column
,
1064 p_last_line
, p_last_column
);
1065 unnamedpart
->set_location(p_filename
, p_first_line
, p_first_column
,
1066 p_last_line
, p_last_column
);
1070 void ParsedActualParameters::dump(unsigned int level
) const
1072 DEBUG(level
, "ParsedActualParameters at %p", (const void*)this);
1073 unnamedpart
->dump(level
+1);
1075 namedpart
->dump(level
+1);