1 /************************************************************************/ 2 /* */ 3 /* Centre for Speech Technology Research */ 4 /* University of Edinburgh, UK */ 5 /* Copyright (c) 1996,1997 */ 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 34 35 #ifndef __EST_FEATURED_H__ 36 #define __EST_FEATURED_H__ 37 38 39 #include "EST_Features.h" 40 41 /** A class with the mechanisms needed to give an object features and 42 * access them nicely. Used as a parent class. 43 * 44 * @author Richard Caley <rjc@cstr.ed.ac.uk> 45 * @version $Id: EST_Featured.h,v 1.3 2004/05/04 00:00:16 awb Exp $ */ 46 47 class EST_Featured { 48 private: 49 50 EST_Features *p_features; 51 52 protected: 53 54 EST_Featured(void); 55 EST_Featured(const EST_Featured &f); 56 ~EST_Featured(void); 57 58 void init_features(); 59 60 void copy_features(const EST_Featured &f); 61 62 void clear_features(); 63 ensure_features(void)64 void ensure_features(void) 65 { if (p_features==NULL) p_features= new EST_Features; } 66 67 public: 68 f_Int(const char * name,int def)69 int f_Int(const char *name, int def) const 70 { return p_features?p_features->I(name, def):def; } f_Int(const char * name)71 int f_Int(const char *name) const 72 { return p_features?p_features->I(name):0; } f_I(const char * name,int def)73 int f_I(const char *name, int def) const 74 {return f_Int(name, def);} f_I(const char * name)75 int f_I(const char *name) const 76 {return f_Int(name);} f_set(const EST_String name,int val)77 void f_set(const EST_String name, int val) 78 { ensure_features(); p_features->set(name, val); } f_set_path(const EST_String name,int val)79 void f_set_path(const EST_String name, int val) 80 { ensure_features(); p_features->set_path(name, val); } 81 82 f_Float(const char * name,float def)83 float f_Float(const char *name, float def) const 84 { return p_features?p_features->F(name, def):def; } f_Float(const char * name)85 float f_Float(const char *name) const 86 { return p_features?p_features->F(name):0.0; } f_F(const char * name,float def)87 float f_F(const char *name, float def) const 88 {return f_Float(name, def);} f_F(const char * name)89 float f_F(const char *name) const 90 {return f_Float(name);} f_set(const EST_String name,float val)91 void f_set(const EST_String name, float val) 92 { ensure_features(); p_features->set(name, val); } f_set_path(const EST_String name,float val)93 void f_set_path(const EST_String name, float val) 94 { ensure_features(); p_features->set_path(name, val); } 95 96 f_String(const char * name,const EST_String & def)97 EST_String f_String(const char *name, const EST_String &def) const 98 { return p_features?p_features->S(name, def):def; } f_String(const char * name)99 EST_String f_String(const char *name) const 100 { return p_features?p_features->S(name):EST_String::Empty; } f_S(const char * name,const EST_String & def)101 EST_String f_S(const char *name, const EST_String &def) const 102 {return f_String(name, def);} f_S(const char * name)103 EST_String f_S(const char *name) const 104 {return f_String(name);} f_set(const EST_String name,const char * val)105 void f_set(const EST_String name, const char *val) 106 { ensure_features(); p_features->set(name, val); } f_set_path(const EST_String name,const char * val)107 void f_set_path(const EST_String name, const char *val) 108 { ensure_features(); p_features->set_path(name, val); } 109 110 111 const EST_Val &f_Val(const char *name, const EST_Val &def) const; 112 const EST_Val &f_Val(const char *name) const; 113 f_V(const char * name,const EST_Val & def)114 const EST_Val &f_V(const char *name, const EST_Val &def) const 115 {return f_Val(name, def);} f_V(const char * name)116 const EST_Val &f_V(const char *name) const 117 {return f_Val(name);} f_set_val(const EST_String name,EST_Val val)118 void f_set_val(const EST_String name, EST_Val val) 119 { ensure_features(); p_features->set_val(name, val); } f_set_path(const EST_String name,EST_Val val)120 void f_set_path(const EST_String name, EST_Val val) 121 { ensure_features(); p_features->set_path(name, val); } 122 f_set(const EST_Features & f)123 void f_set(const EST_Features &f) 124 { ensure_features(); *p_features = f; } 125 f_present(const EST_String name)126 int f_present(const EST_String name) const 127 {return p_features && p_features->present(name); } 128 f_remove(const EST_String name)129 void f_remove(const EST_String name) 130 { if (p_features) p_features->remove(name); } 131 132 // iteration 133 134 protected: 135 struct IPointer_feat { EST_Features::RwEntries i; }; 136 // struct IPointer_feat { EST_TRwStructIterator< EST_Features, EST_Features::IPointer, EST_Features::Entry> i; }; 137 point_to_first(IPointer_feat & ip)138 void point_to_first(IPointer_feat &ip) const 139 { if (p_features) ip.i.begin(*p_features);} move_pointer_forwards(IPointer_feat & ip)140 void move_pointer_forwards(IPointer_feat &ip) const 141 { ++(ip.i); } points_to_something(const IPointer_feat & ip)142 bool points_to_something(const IPointer_feat &ip) const 143 { return ip.i != 0; } points_at(const IPointer_feat & ip)144 EST_TKVI<EST_String, EST_Val> &points_at(const IPointer_feat &ip) 145 { return *(ip.i); } 146 147 friend class EST_TIterator< EST_Featured, IPointer_feat, EST_TKVI<EST_String, EST_Val> >; 148 friend class EST_TStructIterator< EST_Featured, IPointer_feat, EST_TKVI<EST_String, EST_Val> >; 149 friend class EST_TRwIterator< EST_Featured, IPointer_feat, EST_TKVI<EST_String, EST_Val> >; 150 friend class EST_TRwStructIterator< EST_Featured, IPointer_feat, EST_TKVI<EST_String, EST_Val> >; 151 152 public: 153 typedef EST_TKVI<EST_String, EST_Val> FeatEntry; 154 typedef EST_TStructIterator< EST_Featured, IPointer_feat, FeatEntry> FeatEntries; 155 typedef EST_TRwStructIterator< EST_Featured, IPointer_feat, FeatEntry> RwFeatEntries; 156 157 158 159 }; 160 161 #endif 162 163