Commit 736c4bda authored by Botond Baranyi's avatar Botond Baranyi
Browse files

Changed handling of optional fields in template concatenation to improve performance (bug 534678)



Change-Id: I7e70eb2269280bd2e088c7a5b3ac78ff38474797
Signed-off-by: Botond Baranyi's avatarBotond Baranyi <botond.baranyi@ericsson.com>
parent ea41bdad
......@@ -4686,16 +4686,12 @@ void defRecordOfTemplate2(const struct_of_def *sdef, output_struct *output)
"const %s_template& right_template);\n", name, name);
def = mputprintf(def, "friend %s_template operator+(const %s& left_value, "
"const %s_template& right_template);\n", name, name, name);
def = mputprintf(def, "friend %s_template operator+(const OPTIONAL<%s>& left_value, "
"const %s_template& right_template);\n", name, name, name);
def = mputprintf(def, "friend %s_template operator+(template_sel left_template, "
"const %s& right_value);\n", name, name);
def = mputprintf(def, "friend %s_template operator+(template_sel left_template, "
"const OPTIONAL<%s>& right_value);\n", name, name);
def = mputprintf(def, "friend %s_template operator+(const %s& left_value, "
"template_sel right_template);\n", name, name);
def = mputprintf(def, "friend %s_template operator+(const OPTIONAL<%s>& left_value, "
"template_sel right_template);\n", name, name);
/* public member functions */
def = mputstr(def, "\npublic:\n");
......@@ -4822,18 +4818,6 @@ void defRecordOfTemplate2(const struct_of_def *sdef, output_struct *output)
"return ret_val;\n"
"}\n\n", name, name, name, name);
def = mputprintf(def, "%s_template operator+("
"const OPTIONAL<%s>& other_value) const;\n", name, name);
src = mputprintf(src,
"%s_template %s_template::operator+(const OPTIONAL<%s>& other_value) const\n"
"{\n"
"if (other_value.is_present()) {\n"
"return *this + (const %s&)other_value;\n"
"}\n"
"TTCN_error(\"Operand of %s of template concatenation is an unbound or "
"omitted record/set field.\");\n"
"}\n\n", name, name, name, name, sdef->kind == RECORD_OF ? "record" : "set");
def = mputprintf(def, "%s_template operator+(template_sel other_value) const;\n",
name);
src = mputprintf(src,
......@@ -5018,22 +5002,6 @@ void defRecordOfTemplate2(const struct_of_def *sdef, output_struct *output)
"return ret_val;\n"
"}\n\n", name, name, name, name, name);
output->header.function_prototypes =
mputprintf(output->header.function_prototypes,
"extern %s_template operator+(const OPTIONAL<%s>& left_value, "
"const %s_template& right_template);\n", name, name, name);
output->source.function_bodies =
mputprintf(output->source.function_bodies,
"%s_template operator+(const OPTIONAL<%s>& left_value, "
"const %s_template& right_template)\n"
"{\n"
"if (left_value.is_present()) {\n"
"return (const %s&)left_value + right_template;\n"
"}\n"
"TTCN_error(\"Operand of %s of template concatenation is an unbound or "
"omitted record/set field.\");\n"
"}\n\n", name, name, name, name, sdef->kind == RECORD_OF ? "record" : "set");
output->header.function_prototypes =
mputprintf(output->header.function_prototypes,
"extern %s_template operator+(template_sel left_template, "
......@@ -5055,22 +5023,6 @@ void defRecordOfTemplate2(const struct_of_def *sdef, output_struct *output)
"return ret_val;\n"
"}\n\n", name, name, name, name, name);
output->header.function_prototypes =
mputprintf(output->header.function_prototypes,
"extern %s_template operator+(template_sel left_template, "
"const OPTIONAL<%s>& right_value);\n", name, name);
output->source.function_bodies =
mputprintf(output->source.function_bodies,
"%s_template operator+(template_sel left_template, "
"const OPTIONAL<%s>& right_value)\n"
"{\n"
"if (right_value.is_present()) {\n"
"return left_template + (const %s&)right_value;\n"
"}\n"
"TTCN_error(\"Operand of %s template concatenation is an unbound or "
"omitted record/set field.\");\n"
"}\n\n", name, name, name, sdef->kind == RECORD_OF ? "record" : "set");
output->header.function_prototypes =
mputprintf(output->header.function_prototypes,
"extern %s_template operator+(const %s& left_value, "
......@@ -5091,20 +5043,4 @@ void defRecordOfTemplate2(const struct_of_def *sdef, output_struct *output)
"ret_val.concat(pos);\n"
"return ret_val;\n"
"}\n\n", name, name, name, name, name);
output->header.function_prototypes =
mputprintf(output->header.function_prototypes,
"extern %s_template operator+(const OPTIONAL<%s>& left_value, "
"template_sel right_template);\n", name, name);
output->source.function_bodies =
mputprintf(output->source.function_bodies,
"%s_template operator+(const OPTIONAL<%s>& left_value, "
"template_sel right_template)\n"
"{\n"
"if (left_value.is_present()) {\n"
"return (const %s&)left_value + right_template;\n"
"}\n"
"TTCN_error(\"Operand of %s template concatenation is an unbound or "
"omitted record/set field.\");\n"
"}\n\n", name, name, name, sdef->kind == RECORD_OF ? "record" : "set");
}
......@@ -504,8 +504,8 @@ namespace Ttcn {
string PatternString::create_charstring_literals(Common::Module *p_mod, string& preamble)
{
/* The cast is there for the benefit of OPTIONAL<CHARSTRING>, because
* it doesn't have operator+(). Only the first member needs the cast
* (the others will be automagically converted to satisfy
* it doesn't have operator+(). In most cases only the first member needs
* the cast (the others will be automagically converted to satisfy
* CHARSTRING::operator+(const CHARSTRING&) ) */
string s;
if (pattern_type == CSTR_PATTERN)
......@@ -612,13 +612,19 @@ namespace Ttcn {
break; }
// Not known in compile time
case ps_elem_t::PSE_REF: {
Common::Assignment* assign = pse->ref->get_refd_assignment();
if (use_runtime_2 && i > 0 &&
assign->get_Type()->field_is_optional(pse->ref->get_subrefs())) {
// in RT2 convert all operands of type OPTIONAL<CHARSTRING> to
// CHARSTRING, not just the first one
s += "(CHARSTRING)";
}
expression_struct expr;
Code::init_expr(&expr);
pse->ref->generate_code(&expr);
if (expr.preamble || expr.postamble)
FATAL_ERROR("PatternString::create_charstring_literals()");
s += expr.expr;
Common::Assignment* assign = pse->ref->get_refd_assignment();
char* str = NULL;
// TODO: these checks will generated each time a reference is referenced in a pattern
......
......@@ -1733,6 +1733,17 @@ namespace Ttcn {
return first ? u.concat.op1 : u.concat.op2;
}
bool Template::is_optional_value_ref() const
{
if (templatetype != SPECIFIC_VALUE ||
u.specific_value->get_valuetype() != Common::Value::V_REFD) {
return false;
}
Common::Reference* ref = u.specific_value->get_reference();
return ref->get_refd_assignment()->get_Type()->field_is_optional(
ref->get_subrefs());
}
Template* Template::get_template_refd(ReferenceChain *refch)
{
unsigned int const prev_err_count = get_error_count();
......@@ -5006,7 +5017,7 @@ compile_time:
string left_expr;
string right_expr;
if (u.concat.op1->has_single_expr()) {
left_expr = u.concat.op1->get_single_expr(false);
left_expr = u.concat.op1->get_single_expr(u.concat.op1->is_optional_value_ref());
}
else {
left_expr = my_scope->get_scope_mod_gen()->get_temporary_id();
......@@ -5015,7 +5026,7 @@ compile_time:
str = u.concat.op1->generate_code_init(str, left_expr.c_str());
}
if (u.concat.op2->has_single_expr()) {
right_expr = u.concat.op2->get_single_expr(false);
right_expr = u.concat.op2->get_single_expr(u.concat.op2->is_optional_value_ref());
}
else {
right_expr = my_scope->get_scope_mod_gen()->get_temporary_id();
......@@ -5326,8 +5337,8 @@ compile_time:
if (!use_runtime_2) {
FATAL_ERROR("Template::get_single_expr()");
}
ret_val = u.concat.op1->get_single_expr(false) + " + " +
u.concat.op2->get_single_expr(false);
ret_val = u.concat.op1->get_single_expr(u.concat.op1->is_optional_value_ref()) + " + " +
u.concat.op2->get_single_expr(u.concat.op2->is_optional_value_ref());
break;
default:
FATAL_ERROR("Template::get_single_expr()");
......
......@@ -310,6 +310,7 @@ namespace Ttcn {
Value* get_string_encoding() const;
TemplateInstance* get_decode_target() const;
Template* get_concat_operand(bool first) const;
bool is_optional_value_ref() const;
private:
Template* get_template_refd(ReferenceChain *refch);
Template* get_refd_field_template(const Identifier& field_id,
......
......@@ -257,16 +257,6 @@ BITSTRING BITSTRING::operator+(const BITSTRING_ELEMENT& other_value) const
return ret_val;
}
#ifdef TITAN_RUNTIME_2
BITSTRING BITSTRING::operator+(const OPTIONAL<BITSTRING>& other_value) const
{
if (other_value.is_present()) {
return *this + (const BITSTRING&)other_value;
}
TTCN_error("Unbound or omitted right operand of bitstring concatenation.");
}
#endif
BITSTRING BITSTRING::operator~() const
{
must_bound("Unbound bitstring operand of operator not4b.");
......@@ -1417,17 +1407,6 @@ BITSTRING BITSTRING_ELEMENT::operator+(const BITSTRING_ELEMENT& other_value)
return BITSTRING(2, &result);
}
#ifdef TITAN_RUNTIME_2
BITSTRING BITSTRING_ELEMENT::operator+(
const OPTIONAL<BITSTRING>& other_value) const
{
if (other_value.is_present()) {
return *this + (const BITSTRING&)other_value;
}
TTCN_error("Unbound or omitted right operand of bitstring concatenation.");
}
#endif
BITSTRING BITSTRING_ELEMENT::operator~() const
{
must_bound("Unbound bitstring element operand of operator not4b.");
......@@ -1905,16 +1884,6 @@ BITSTRING_template BITSTRING_template::operator+(
return *this + BITSTRING(other_value);
}
BITSTRING_template BITSTRING_template::operator+(
const OPTIONAL<BITSTRING>& other_value) const
{
if (other_value.is_present()) {
return *this + (const BITSTRING&)other_value;
}
TTCN_error("Operand of bitstring template concatenation is an "
"unbound or omitted record/set field.");
}
BITSTRING_template BITSTRING_template::operator+(
template_sel other_template_sel) const
{
......@@ -1950,16 +1919,6 @@ BITSTRING_template operator+(const BITSTRING_ELEMENT& left_value,
return BITSTRING(left_value) + right_template;
}
BITSTRING_template operator+(const OPTIONAL<BITSTRING>& left_value,
const BITSTRING_template& right_template)
{
if (left_value.is_present()) {
return (const BITSTRING&)left_value + right_template;
}
TTCN_error("Operand of bitstring template concatenation is an "
"unbound or omitted record/set field.");
}
BITSTRING_template operator+(template_sel left_template_sel,
const BITSTRING_template& right_template)
{
......@@ -1993,16 +1952,6 @@ BITSTRING_template operator+(const BITSTRING_ELEMENT& left_value,
return BITSTRING(left_value) + right_template_sel;
}
BITSTRING_template operator+(const OPTIONAL<BITSTRING>& left_value,
template_sel right_template_sel)
{
if (left_value.is_present()) {
return (const BITSTRING&)left_value + right_template_sel;
}
TTCN_error("Operand of bitstring template concatenation is an "
"unbound or omitted record/set field.");
}
BITSTRING_template operator+(template_sel left_template_sel,
const BITSTRING& right_value)
{
......@@ -2018,16 +1967,6 @@ BITSTRING_template operator+(template_sel left_template_sel,
{
return left_template_sel + BITSTRING(right_value);
}
BITSTRING_template operator+(template_sel left_template_sel,
const OPTIONAL<BITSTRING>& right_value)
{
if (right_value.is_present()) {
return left_template_sel + (const BITSTRING&)right_value;
}
TTCN_error("Operand of bitstring template concatenation is an "
"unbound or omitted record/set field.");
}
#endif // TITAN_RUNTIME_2
BITSTRING_ELEMENT BITSTRING_template::operator[](int index_value)
......
......@@ -112,9 +112,6 @@ public:
BITSTRING operator+(const BITSTRING& other_value) const;
BITSTRING operator+(const BITSTRING_ELEMENT& other_value) const;
#ifdef TITAN_RUNTIME_2
BITSTRING operator+(const OPTIONAL<BITSTRING>& other_value) const;
#endif
BITSTRING operator~() const;
BITSTRING operator&(const BITSTRING& other_value) const;
......@@ -241,9 +238,6 @@ public:
BITSTRING operator+(const BITSTRING& other_value) const;
BITSTRING operator+(const BITSTRING_ELEMENT& other_value) const;
#ifdef TITAN_RUNTIME_2
BITSTRING operator+(const OPTIONAL<BITSTRING>& other_value) const;
#endif
BITSTRING operator~() const;
BITSTRING operator&(const BITSTRING& other_value) const;
......@@ -278,22 +272,16 @@ private:
const BITSTRING_template& right_template);
friend BITSTRING_template operator+(const BITSTRING_ELEMENT& left_value,
const BITSTRING_template& right_template);
friend BITSTRING_template operator+(const OPTIONAL<BITSTRING>& left_value,
const BITSTRING_template& right_template);
friend BITSTRING_template operator+(template_sel left_template_sel,
const BITSTRING_template& right_template);
friend BITSTRING_template operator+(const BITSTRING& left_value,
template_sel right_template_sel);
friend BITSTRING_template operator+(const BITSTRING_ELEMENT& left_value,
template_sel right_template_sel);
friend BITSTRING_template operator+(const OPTIONAL<BITSTRING>& left_value,
template_sel right_template_sel);
friend BITSTRING_template operator+(template_sel left_template_sel,
const BITSTRING& right_value);
friend BITSTRING_template operator+(template_sel left_template_sel,
const BITSTRING_ELEMENT& right_value);
friend BITSTRING_template operator+(template_sel left_template_sel,
const OPTIONAL<BITSTRING>& right_value);
#endif
BITSTRING single_value;
......@@ -338,7 +326,6 @@ public:
BITSTRING_template operator+(const BITSTRING_template& other_value) const;
BITSTRING_template operator+(const BITSTRING& other_value) const;
BITSTRING_template operator+(const BITSTRING_ELEMENT& other_value) const;
BITSTRING_template operator+(const OPTIONAL<BITSTRING>& other_value) const;
BITSTRING_template operator+(template_sel other_template_sel) const;
#endif
......@@ -389,22 +376,16 @@ extern BITSTRING_template operator+(const BITSTRING& left_value,
const BITSTRING_template& right_template);
extern BITSTRING_template operator+(const BITSTRING_ELEMENT& left_value,
const BITSTRING_template& right_template);
extern BITSTRING_template operator+(const OPTIONAL<BITSTRING>& left_value,
const BITSTRING_template& right_template);
extern BITSTRING_template operator+(template_sel left_template_sel,
const BITSTRING_template& right_template);
extern BITSTRING_template operator+(const BITSTRING& left_value,
template_sel right_template_sel);
extern BITSTRING_template operator+(const BITSTRING_ELEMENT& left_value,
template_sel right_template_sel);
extern BITSTRING_template operator+(const OPTIONAL<BITSTRING>& left_value,
template_sel right_template_sel);
extern BITSTRING_template operator+(template_sel left_template_sel,
const BITSTRING& right_value);
extern BITSTRING_template operator+(template_sel left_template_sel,
const BITSTRING_ELEMENT& right_value);
extern BITSTRING_template operator+(template_sel left_template_sel,
const OPTIONAL<BITSTRING>& right_value);
#endif
#endif
......@@ -324,16 +324,6 @@ CHARSTRING CHARSTRING::operator+(const CHARSTRING_ELEMENT& other_value) const
return ret_val;
}
#ifdef TITAN_RUNTIME_2
CHARSTRING CHARSTRING::operator+(const OPTIONAL<CHARSTRING>& other_value) const
{
if (other_value.is_present()) {
return *this + (const CHARSTRING&)other_value;
}
TTCN_error("Unbound or omitted right operand of charstring concatenation.");
}
#endif
UNIVERSAL_CHARSTRING CHARSTRING::operator+
(const UNIVERSAL_CHARSTRING& other_value) const
{
......@@ -388,18 +378,6 @@ UNIVERSAL_CHARSTRING CHARSTRING::operator+
}
}
#ifdef TITAN_RUNTIME_2
UNIVERSAL_CHARSTRING CHARSTRING::operator+(
const OPTIONAL<UNIVERSAL_CHARSTRING>& other_value) const
{
if (other_value.is_present()) {
return *this + (const UNIVERSAL_CHARSTRING&)other_value;
}
TTCN_error("Unbound or omitted right operand of universal charstring "
"concatenation.");
}
#endif
CHARSTRING& CHARSTRING::operator+=(char other_value)
{
must_bound("Appending a character to an unbound charstring value.");
......@@ -1998,17 +1976,6 @@ CHARSTRING CHARSTRING_ELEMENT::operator+(const CHARSTRING_ELEMENT&
return CHARSTRING(2, result);
}
#ifdef TITAN_RUNTIME_2
CHARSTRING CHARSTRING_ELEMENT::operator+(
const OPTIONAL<CHARSTRING>& other_value) const
{
if (other_value.is_present()) {
return *this + (const CHARSTRING&)other_value;
}
TTCN_error("Unbound or omitted right operand of charstring concatenation.");
}
#endif
UNIVERSAL_CHARSTRING CHARSTRING_ELEMENT::operator+
(const UNIVERSAL_CHARSTRING& other_value) const
{
......@@ -2049,18 +2016,6 @@ UNIVERSAL_CHARSTRING CHARSTRING_ELEMENT::operator+
return UNIVERSAL_CHARSTRING(2, result);
}
#ifdef TITAN_RUNTIME_2
UNIVERSAL_CHARSTRING CHARSTRING_ELEMENT::operator+(
const OPTIONAL<UNIVERSAL_CHARSTRING>& other_value) const
{
if (other_value.is_present()) {
return *this + (const UNIVERSAL_CHARSTRING&)other_value;
}
TTCN_error("Unbound or omitted right operand of universal charstring "
"concatenation.");
}
#endif
char CHARSTRING_ELEMENT::get_char() const
{
return str_val.val_ptr->chars_ptr[char_pos];
......@@ -2126,62 +2081,6 @@ CHARSTRING operator+(const char* string_value,
return ret_val;
}
#ifdef TITAN_RUNTIME_2
CHARSTRING operator+(const OPTIONAL<CHARSTRING>& left_value,
const CHARSTRING& right_value)
{
if (left_value.is_present()) {
return (const CHARSTRING&)left_value + right_value;
}
TTCN_error("Unbound or omitted left operand of charstring "
"concatenation.");
}
CHARSTRING operator+(const OPTIONAL<CHARSTRING>& left_value,
const CHARSTRING_ELEMENT& right_value)
{
if (left_value.is_present()) {
return (const CHARSTRING&)left_value + right_value;
}
TTCN_error("Unbound or omitted left operand of charstring "
"concatenation.");
}
UNIVERSAL_CHARSTRING operator+(const OPTIONAL<CHARSTRING>& left_value,
const UNIVERSAL_CHARSTRING& right_value)
{
if (left_value.is_present()) {
return (const CHARSTRING&)left_value + right_value;
}
TTCN_error("Unbound or omitted left operand of universal charstring "
"concatenation.");
}
UNIVERSAL_CHARSTRING operator+(const OPTIONAL<CHARSTRING>& left_value,
const UNIVERSAL_CHARSTRING_ELEMENT& right_value)
{
if (left_value.is_present()) {
return (const CHARSTRING&)left_value + right_value;
}
TTCN_error("Unbound or omitted left operand of universal charstring "
"concatenation.");
}
UNIVERSAL_CHARSTRING operator+(const OPTIONAL<CHARSTRING>& left_value,
const OPTIONAL<UNIVERSAL_CHARSTRING>& right_value)
{
if (!left_value.is_present()) {
TTCN_error("Unbound or omitted left operand of universal charstring "
"concatenation.");
}
if (!right_value.is_present()) {
TTCN_error("Unbound or omitted right operand of universal charstring "
"concatenation.");
}
return (const CHARSTRING&)left_value + (const UNIVERSAL_CHARSTRING&)right_value;
}
#endif // TITAN_RUNTIME_2
CHARSTRING operator<<=(const char *string_value, const INTEGER& rotate_count)
{
return CHARSTRING(string_value) <<= rotate_count;
......@@ -2411,20 +2310,6 @@ CHARSTRING_template CHARSTRING_template::operator+(
"uninitialized or unsupported template.");
}
CHARSTRING_template CHARSTRING_template::operator+(
const OPTIONAL<CHARSTRING>& other_value) const
{
if (template_selection != SPECIFIC_VALUE) {
TTCN_error("Operand of charstring template concatenation is an "
"uninitialized or unsupported template.");
}
if (!other_value.is_present()) {
TTCN_error("Operand of charstring template concatenation is an "
"unbound or omitted record/set field.");
}
return single_value + (const CHARSTRING&)other_value;
}
UNIVERSAL_CHARSTRING_template CHARSTRING_template::operator+(
const UNIVERSAL_CHARSTRING& other_value) const
{
......@@ -2445,20 +2330,6 @@ UNIVERSAL_CHARSTRING_template CHARSTRING_template::operator+(
return single_value + other_value;
}
UNIVERSAL_CHARSTRING_template CHARSTRING_template::operator+(
const OPTIONAL<UNIVERSAL_CHARSTRING>& other_value) const
{
if (template_selection != SPECIFIC_VALUE) {
TTCN_error("Operand of universal charstring template concatenation is an "
"uninitialized or unsupported template.");
}
if (!other_value.is_present()) {
TTCN_error("Operand of universal charstring template concatenation is an "
"unbound or omitted record/set field.");
}
return single_value + (const UNIVERSAL_CHARSTRING&)other_value;
}
CHARSTRING_template operator+(const CHARSTRING& left_value,
const CHARSTRING_template& right_template)
{
......@@ -2479,20 +2350,6 @@ CHARSTRING_template operator+(const CHARSTRING_ELEMENT& left_value,
"uninitialized or unsupported template.");
}
CHARSTRING_template operator+(const OPTIONAL<CHARSTRING>& left_value,
const CHARSTRING_template& right_template)
{
if (!left_value.is_present()) {
TTCN_error("Operand of charstring template concatenation is an "
"unbound or omitted record/set field.");
}
if (right_template.template_selection != SPECIFIC_VALUE) {
TTCN_error("Operand of charstring template concatenation is an "
"uninitialized or unsupported template.");
}
return (const CHARSTRING&)left_value + right_template.single_value;
}
UNIVERSAL_CHARSTRING_template operator+(const UNIVERSAL_CHARSTRING& left_value,
const CHARSTRING_template& right_template)
{
......@@ -2513,21 +2370,6 @@ UNIVERSAL_CHARSTRING_template operator+(
}
return left_value + right_template.single_value;
}
UNIVERSAL_CHARSTRING_template operator+(
const OPTIONAL<UNIVERSAL_CHARSTRING>& left_value,
const CHARSTRING_template& right_template)
{
if (!left_value.is_present()) {
TTCN_error("Operand of universal charstring template concatenation is an "
"unbound or omitted record/set field.");
}
if (right_template.template_selection != SPECIFIC_VALUE) {
TTCN_error("Operand of universal charstring template concatenation is an "
"uninitialized or unsupported template.");
}
return (const UNIVERSAL_CHARSTRING&)left_value + right_template.single_value;
}
#endif // TITAN_RUNTIME_2
CHARSTRING_ELEMENT CHARSTRING_template::operator[](int index_value)
......
......@@ -161,16 +161,9 @@ public:
CHARSTRING operator+(const char* other_value) const;
CHARSTRING operator+(const CHARSTRING& other_value) const;
CHARSTRING operator+(const CHARSTRING_ELEMENT& other_value) const;
#ifdef TITAN_RUNTIME_2
CHARSTRING operator+(const OPTIONAL<CHARSTRING>& other_value) const;
#endif
UNIVERSAL_CHARSTRING operator+(const UNIVERSAL_CHARSTRING& other_value) const;
UNIVERSAL_CHARSTRING operator+
(const UNIVERSAL_CHARSTRING_ELEMENT& other_value) const;
#ifdef TITAN_RUNTIME_2
UNIVERSAL_CHARSTRING operator+(
const OPTIONAL<UNIVERSAL_CHARSTRING>& other_value) const;
#endif
CHARSTRING& operator+=(char other_value);
CHARSTRING& operator+=(const char *other_value);
......@@ -322,16 +315,9 @@ public:
CHARSTRING operator+(const char *other_value) const;
CHARSTRING operator+(const CHARSTRING& other_value) const;
CHARSTRING operator+(const CHARSTRING_ELEMENT& other_value) const;
#ifdef TITAN_RUNTIME_2
CHARSTRING operator+(const OPTIONAL<CHARSTRING>& other_value) const;
#endif
UNIVERSAL_CHARSTRING operator+(const UNIVERSAL_CHARSTRING& other_value) const;
UNIVERSAL_CHARSTRING operator+
(const UNIVERSAL_CHARSTRING_ELEMENT& other_value) const;
#ifdef TITAN_RUNTIME_2
UNIVERSAL_CHARSTRING operator+(
const OPTIONAL<UNIVERSAL_CHARSTRING>& other_value) const;
#endif
inline boolean is_bound() const { return bound_flag; }
inline boolean is_present() const { return bound_flag; }
......@@ -365,18 +351,6 @@ extern CHARSTRING operator+(const char* string_value,
const CHARSTRING& other_value);