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