fixed Segfault in decmatch confomance test cases (artf764443)
[deliverable/titan.core.git] / langviz / Symbol.cc
CommitLineData
d44e3c4f 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
7 *
8 * Contributors:
9 * Balasko, Jeno
10 * Forstner, Matyas
11 *
12 ******************************************************************************/
970ed795
EL
13#include "Symbol.hh"
14#include "Grammar.hh"
15#include "../common/memory.h"
16
17// =================================
18// ===== Symbol
19// =================================
20
21Symbol::Symbol(const Symbol& p)
22 : Node(p), id(p.id), id_dot(p.id),
23 is_terminal(p.is_terminal), is_recursive(p.is_recursive),
24 can_be_empty(p.can_be_empty), dist(p.dist), weight(p.weight)
25{
26}
27
28Symbol::Symbol(const string& p_id)
29 : id(p_id), is_terminal(false), is_recursive(false), can_be_empty(false),
30 dist(-1), weight(-1)
31{
32}
33
34const string& Symbol::get_id_dot()
35{
36 if(id_dot.empty()) {
37 string s=id;
38 for(size_t pos=s.find('\\', 0); pos<s.size();
39 pos=s.find('\\', pos)) {
40 s.replace(pos, 1, "\\\\");
41 pos+=2;
42 }
43 for(size_t pos=s.find('"', 0); pos<s.size();
44 pos=s.find('"', pos)) {
45 s.replace(pos, 1, "\\\"");
46 pos+=2;
47 }
48 id_dot="\"";
49 id_dot+=s;
50 if(can_be_empty) id_dot+="?";
51 if(is_recursive) id_dot+="*";
52
53 {
54 expstring_t tmp_s=mprintf(" (%d)", dist);
55 id_dot+=tmp_s;
56 Free(tmp_s);
57 }
58
59 id_dot+="\"";
60 }
61 return id_dot;
62}
63
64int Symbol::get_weight()
65{
66 if(weight>=0) return weight;
67 if(is_terminal) return weight=0;
68 size_t n=refs.get_nof_ss();
69 for(size_t i=0; i<n; i++) {
70 Symbol *s=refs.get_s_byIndex(i);
71 if(s->dist>dist) refs_weight.add_s(s);
72
73 }
74}
75
76// =================================
77// ===== Symbols
78// =================================
79
80Symbols::Symbols(const Symbols& p)
81 : Node(p)
82{
83 for(size_t i=0; i<p.ss.size(); i++)
84 add_s(p.ss[i]);
85}
86
87Symbols::~Symbols()
88{
89 ss.clear();
90}
91
92void Symbols::add_s(Symbol *p_s)
93{
94 if(!p_s)
95 FATAL_ERROR("NULL parameter: Symbols::add_s()");
96 ss.add(p_s);
97}
98
99void Symbols::replace_aliases(Grammar *grammar)
100{
101 for(size_t i=0; i<ss.size(); i++)
102 ss[i]=grammar->get_alias(ss[i]);
103}
104
105// =================================
106// ===== SymbolMap
107// =================================
108
109SymbolMap::SymbolMap(const SymbolMap& p)
110 : Node(p)
111{
112 for(size_t i=0; i<p.ss.size(); i++) {
113 Symbol *p_s=p.ss.get_nth_elem(i);
114 ss.add(p_s->get_id(), p_s);
115 }
116}
117
118SymbolMap::~SymbolMap()
119{
120 ss.clear();
121}
122
123void SymbolMap::add_s(Symbol *p_s)
124{
125 if(!p_s)
126 FATAL_ERROR("NULL parameter: SymbolMap::add_s()");
127 ss.add(p_s->get_id(), p_s);
128}
129
130void SymbolMap::destruct_ss()
131{
132 for(size_t i=0; i<ss.size(); i++)
133 delete ss.get_nth_elem(i);
134}
135
136void SymbolMap::destruct_symbol(const string& p_id)
137{
138 delete ss[p_id];
139 ss.erase(p_id);
140}
141
142// =================================
143// ===== SymbolSet
144// =================================
145
146SymbolSet::SymbolSet(const SymbolSet& p)
147{
148 FATAL_ERROR("SymbolSet::SymbolSet");
149}
150
151SymbolSet::~SymbolSet()
152{
153 ss.clear();
154}
155
156void SymbolSet::add_s(Symbol *p_s)
157{
158 if(ss.has_key(p_s)) return;
159 ss.add(p_s, 0);
160}
161
162void SymbolSet::add_ss(const SymbolSet& p_ss)
163{
164 size_t n=p_ss.ss.size();
165 for(size_t i=0; i<n; i++) {
166 Symbol *s=p_ss.ss.get_nth_key(i);
167 if(!ss.has_key(s)) ss.add(s, 0);
168 }
169}
170
171void SymbolSet::remove_s(Symbol *p_s)
172{
173 if(ss.has_key(p_s)) ss.erase(p_s);
174}
175
176void SymbolSet::remove_ss(const SymbolSet& p_ss)
177{
178 size_t n=p_ss.ss.size();
179 for(size_t i=0; i<n; i++) {
180 Symbol *s=p_ss.ss.get_nth_key(i);
181 if(ss.has_key(s)) ss.erase(s);
182 }
183}
184
185void SymbolSet::remove_all()
186{
187 ss.clear();
188}
189
This page took 0.0307 seconds and 5 git commands to generate.