speech-tools/base_class/EST_Val.cc
2015-09-19 10:52:26 +02:00

151 lines
5.4 KiB
C++

/*************************************************************************/
/* */
/* Centre for Speech Technology Research */
/* University of Edinburgh, UK */
/* Copyright (c) 1995,1996 */
/* All Rights Reserved. */
/* */
/* Permission is hereby granted, free of charge, to use and distribute */
/* this software and its documentation without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of this work, and to */
/* permit persons to whom this work is furnished to do so, subject to */
/* the following conditions: */
/* 1. The code must retain the above copyright notice, this list of */
/* conditions and the following disclaimer. */
/* 2. Any modifications must be clearly marked as such. */
/* 3. Original authors' names are not deleted. */
/* 4. The authors' names are not used to endorse or promote products */
/* derived from this software without specific prior written */
/* permission. */
/* */
/* THE UNIVERSITY OF EDINBURGH AND THE CONTRIBUTORS TO THIS WORK */
/* DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING */
/* ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT */
/* SHALL THE UNIVERSITY OF EDINBURGH NOR THE CONTRIBUTORS BE LIABLE */
/* FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES */
/* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN */
/* AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, */
/* ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF */
/* THIS SOFTWARE. */
/* */
/*************************************************************************/
/* Author : Alan W Black */
/* Date : May 1996 */
/*-----------------------------------------------------------------------*/
/* Class to represent ints, floats and strings */
/* and other arbitrary objects */
/*=======================================================================*/
#include <cstdlib>
#include "EST_Val.h"
#include "EST_string_aux.h"
val_type val_unset = "unset";
val_type val_int = "int";
val_type val_float = "float";
val_type val_string = "string";
EST_Val::EST_Val(const EST_Val &c)
{
if (c.t == val_string)
sval = c.sval;
else if (c.t == val_int)
v.ival = c.v.ival;
else if (c.t == val_float)
v.fval = c.v.fval;
else if (c.t != val_unset)
{ // does references not a real copy
v.pval = new EST_Contents;
*v.pval = *c.v.pval;
}
t=c.t;
}
EST_Val::EST_Val(val_type type,void *p, void (*f)(void *))
{
t=type;
v.pval = new EST_Contents;
v.pval->set_contents(p,f);
}
EST_Val::~EST_Val(void)
{
if ((t != val_int) &&
(t != val_float) &&
(t != val_unset) &&
(t != val_string))
delete v.pval;
}
EST_Val &EST_Val::operator=(const EST_Val &c)
{
// Have to be careful with the case where they are different types
if ((t != val_int) &&
(t != val_float) &&
(t != val_unset) &&
(t != val_string))
delete v.pval;
if (c.t == val_string)
sval = c.sval;
else if (c.t == val_int)
v.ival = c.v.ival;
else if (c.t == val_float)
v.fval = c.v.fval;
else if (c.t != val_unset)
{ // does references not a real copy
v.pval = new EST_Contents;
*v.pval = *c.v.pval;
}
t=c.t;
return *this;
}
const int EST_Val::to_int(void) const
{
// coerce this to an int
if (t==val_float)
return (int)v.fval;
else if (t==val_string)
return atoi(sval);
else
return v.ival; // just for completeness
}
const float EST_Val::to_flt(void) const
{
// coerce this to a float
if (t==val_int)
return (float)v.ival;
else if (t==val_string)
return atof(sval);
else
return v.fval; // just for completeness
}
const EST_String &EST_Val::to_str(void) const
{
// coerce this to and save it for later
// This requires the following casting, so we can still tell the
// compiler this is a const function. If this was properly declared
// non-const vast amounts of the rest of this would also have to be
// non-const. So we do one nasty bit here for uniformity elsewhere.
// Not saving the result is also a possibility but probably too
// inefficient (maybe not with rjc's string class)
EST_String *n = (EST_String *)((void *)&sval);
if (t==val_int)
*n = itoString(v.ival);
else if (t==val_float)
{
if (v.fval == 0)
*n = "0"; // to be compatible with other's notion of fstrings
else
*n = ftoString(v.fval);
}
else if (t != val_string)
*n = EST_String("[Val ")+t+"]";
return sval;
}