1 /* === S I N F G =========================================================== */
3 ** \brief Template Header
5 ** $Id: value.cpp,v 1.1.1.1 2005/01/04 01:23:15 darco Exp $
8 ** Copyright (c) 2002 Robert B. Quattlebaum Jr.
10 ** This software and associated documentation
11 ** are CONFIDENTIAL and PROPRIETARY property of
12 ** the above-mentioned copyright holder.
14 ** You may not copy, print, publish, or in any
15 ** other way distribute this software without
16 ** a prior written agreement with
17 ** the copyright holder.
20 /* ========================================================================= */
22 /* === H E A D E R S ======================================================= */
33 #include <ETL/stringf>
46 using namespace sinfg;
50 /* === M A C R O S ========================================================= */
52 /* === G L O B A L S ======================================================= */
54 /* === P R O C E D U R E S ================================================= */
56 /* === M E T H O D S ======================================================= */
58 ValueBase::ValueBase():type(TYPE_NIL),data(0),ref_count(0),loop_(0)
62 ValueBase::ValueBase(Type x):
71 static_cast<bool*>(data)=new bool();
74 static_cast<int*>(data)=new int();
77 static_cast<Angle*>(data)=new Angle();
80 static_cast<Vector*>(data)=new Vector();
83 static_cast<Time*>(data)=new Time();
86 static_cast<Real*>(data)=new Real();
89 static_cast<Color*>(data)=new Color();
92 static_cast<Segment*>(data)=new Segment();
95 static_cast<BLinePoint*>(data)=new BLinePoint();
98 static_cast<list_type*>(data)=new list_type();
101 static_cast<String*>(data)=new String();
104 static_cast<Gradient*>(data)=new Gradient();
107 static_cast<etl::handle<Canvas>*>(data)=new etl::handle<Canvas>();
114 ValueBase::~ValueBase()
120 ValueBase::get(const char*)const
122 return get(String()).c_str();
129 ValueBase::set(Canvas* x)
132 if(x && x->is_inline())
134 _set(etl::handle<Canvas>(x));
138 _set(etl::loose_handle<Canvas>(x));
144 ValueBase::set(etl::loose_handle<Canvas> x)
147 if(x && x->is_inline())
149 _set(etl::handle<Canvas>(x));
153 _set(etl::loose_handle<Canvas>(x));
159 ValueBase::set(etl::handle<Canvas> x)
162 if(x && x->is_inline())
164 _set(etl::handle<Canvas>(x));
168 _set(etl::loose_handle<Canvas>(x));
174 ValueBase::set(const list_type &x)
180 ValueBase::set(const char* x)
186 ValueBase::is_valid()const
188 return type>TYPE_NIL && type<TYPE_END && ref_count;
192 ValueBase::empty()const
194 return !is_valid() || ((type==TYPE_LIST)?get_list().empty():false);
198 ValueBase::get_contained_type()const
200 if(type!=TYPE_LIST || empty())
202 return get_list().front().get_type();
206 ValueBase::operator=(const ValueBase& x)
213 ref_count=x.ref_count;
222 if(ref_count.unique() && data)
227 delete static_cast<bool*>(data);
230 delete static_cast<int*>(data);
233 delete static_cast<Angle*>(data);
236 delete static_cast<Vector*>(data);
239 delete static_cast<Time*>(data);
242 delete static_cast<Real*>(data);
245 delete static_cast<Color*>(data);
248 delete static_cast<Segment*>(data);
250 case TYPE_BLINEPOINT:
251 delete static_cast<BLinePoint*>(data);
254 delete static_cast<list_type*>(data);
257 delete static_cast<String*>(data);
260 delete static_cast<Gradient*>(data);
266 etl::handle<Canvas> canvas(get(etl::loose_handle<Canvas>()));
267 if(canvas && canvas->is_inline())
269 delete static_cast<etl::handle<Canvas>*>(data);
273 delete static_cast<etl::loose_handle<Canvas>*>(data);
289 ValueBase::type_name(Type id)
317 case TYPE_BLINEPOINT:
318 return "bline_point";
324 sinfg::warning("Encountered unknown ValueBase with an Type of %d",id);
330 ValueBase::ident_type(const String &str)
332 if(str=="nil" || str=="null")
334 else if(str=="time" || str==_("time"))
336 else if(str=="real" || str=="float" || str==_("real"))
338 else if(str=="integer" || str=="int" || str==_("integer"))
340 else if(str=="bool" || str==_("bool"))
342 else if(str=="angle" || str=="degrees" || str=="radians" || str=="rotations")
344 else if(str=="vector" || str=="point")
346 else if(str=="color")
348 else if(str=="string")
350 else if(str=="canvas")
354 else if(str=="segment")
356 else if(str=="gradient")
357 return TYPE_GRADIENT;
358 else if(str=="bline_point" || str=="blinepoint")
359 return TYPE_BLINEPOINT;
365 ValueBase::operator==(const ValueBase& rhs)const
367 if(get_type()!=rhs.get_type())
375 return get(Time()).is_equal(rhs.get(Time()));
377 return abs(get(Real())-rhs.get(Real()))<=0.00000000000001;
379 return get(int())==rhs.get(int());
381 return get(bool())==rhs.get(bool());
383 return get(Angle())==rhs.get(Angle());
385 return get(Vector()).is_equal_to(rhs.get(Vector()));
387 return get(Color())==rhs.get(Color());
389 return get(String())==rhs.get(String());
391 return get(Canvas::LooseHandle())==rhs.get(Canvas::LooseHandle());
393 return get_list()==rhs.get_list();
395 // return get(Segment())==rhs.get(Segment());
397 // return get(Gradient())==rhs.get(Gradient());
398 case TYPE_BLINEPOINT:
399 // return get(BLinePoint())==rhs.get(BLinePoint());