Edinburgh Speech Tools 2.4-release
 
Loading...
Searching...
No Matches
EST_Val.cc
1/*************************************************************************/
2/* */
3/* Centre for Speech Technology Research */
4/* University of Edinburgh, UK */
5/* Copyright (c) 1995,1996 */
6/* All Rights Reserved. */
7/* */
8/* Permission is hereby granted, free of charge, to use and distribute */
9/* this software and its documentation without restriction, including */
10/* without limitation the rights to use, copy, modify, merge, publish, */
11/* distribute, sublicense, and/or sell copies of this work, and to */
12/* permit persons to whom this work is furnished to do so, subject to */
13/* the following conditions: */
14/* 1. The code must retain the above copyright notice, this list of */
15/* conditions and the following disclaimer. */
16/* 2. Any modifications must be clearly marked as such. */
17/* 3. Original authors' names are not deleted. */
18/* 4. The authors' names are not used to endorse or promote products */
19/* derived from this software without specific prior written */
20/* permission. */
21/* */
22/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
23/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
24/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
25/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
26/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
27/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
28/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
29/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
30/* THIS SOFTWARE. */
31/* */
32/*************************************************************************/
33/* Author : Alan W Black */
34/* Date : May 1996 */
35/*-----------------------------------------------------------------------*/
36/* Class to represent ints, floats and strings */
37/* and other arbitrary objects */
38/*=======================================================================*/
39#include <cstdlib>
40#include "EST_Val.h"
41#include "EST_string_aux.h"
42
43val_type val_unset = "unset";
44val_type val_int = "int";
45val_type val_float = "float";
46val_type val_string = "string";
47
49{
50 if (c.t == val_string)
51 sval = c.sval;
52 else if (c.t == val_int)
53 v.ival = c.v.ival;
54 else if (c.t == val_float)
55 v.fval = c.v.fval;
56 else if (c.t != val_unset)
57 { // does references not a real copy
58 v.pval = new EST_Contents;
59 *v.pval = *c.v.pval;
60 }
61 t=c.t;
62}
63
64EST_Val::EST_Val(val_type type,void *p, void (*f)(void *))
65{
66 t=type;
67 v.pval = new EST_Contents;
68 v.pval->set_contents(p,f);
69}
70
72{
73 if ((t != val_int) &&
74 (t != val_float) &&
75 (t != val_unset) &&
76 (t != val_string))
77 delete v.pval;
78}
79
81{
82 // Have to be careful with the case where they are different types
83 if ((t != val_int) &&
84 (t != val_float) &&
85 (t != val_unset) &&
86 (t != val_string))
87 delete v.pval;
88
89 if (c.t == val_string)
90 sval = c.sval;
91 else if (c.t == val_int)
92 v.ival = c.v.ival;
93 else if (c.t == val_float)
94 v.fval = c.v.fval;
95 else if (c.t != val_unset)
96 { // does references not a real copy
97 v.pval = new EST_Contents;
98 *v.pval = *c.v.pval;
99 }
100 t=c.t;
101 return *this;
102}
103
104const int EST_Val::to_int(void) const
105{
106 // coerce this to an int
107 if (t==val_float)
108 return (int)v.fval;
109 else if (t==val_string)
110 return atoi(sval);
111 else
112 return v.ival; // just for completeness
113}
114
115const float EST_Val::to_flt(void) const
116{
117 // coerce this to a float
118 if (t==val_int)
119 return (float)v.ival;
120 else if (t==val_string)
121 return atof(sval);
122 else
123 return v.fval; // just for completeness
124}
125
126const EST_String &EST_Val::to_str(void) const
127{
128 // coerce this to and save it for later
129 // This requires the following casting, so we can still tell the
130 // compiler this is a const function. If this was properly declared
131 // non-const vast amounts of the rest of this would also have to be
132 // non-const. So we do one nasty bit here for uniformity elsewhere.
133 // Not saving the result is also a possibility but probably too
134 // inefficient (maybe not with rjc's string class)
135 EST_String *n = (EST_String *)((void *)&sval);
136 if (t==val_int)
137 *n = itoString(v.ival);
138 else if (t==val_float)
139 {
140 if (v.fval == 0)
141 *n = "0"; // to be compatible with other's notion of fstrings
142 else
143 *n = ftoString(v.fval);
144 }
145 else if (t != val_string)
146 *n = EST_String("[Val ")+t+"]";
147
148 return sval;
149}
150
EST_Val & operator=(const int i)
Definition EST_Val.h:172
const val_type type(void) const
Definition EST_Val.h:126
EST_Val()
Definition EST_Val.h:88
~EST_Val(void)
Definition EST_Val.cc:71