00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef _UFOBJECT_H
00014 #define _UFOBJECT_H
00015
00016
00017
00018
00019
00021 typedef const char *UFName;
00022
00024 typedef struct UFObject UFObject;
00025
00027 typedef enum {
00028 uf_value_changed,
00029 uf_default_changed,
00030 uf_element_added,
00031 uf_user_data_set,
00032 uf_destroyed
00033 } UFEventType;
00034
00036 typedef void (UFEventHandle)(UFObject *, UFEventType);
00037
00038
00039
00040
00041
00042 #ifdef __cplusplus
00043
00044 #include <string>
00045 #include <list>
00046 #include <stdexcept>
00047
00083 class UFObject {
00084 public:
00088 virtual ~UFObject();
00089 UFName Name() const;
00090
00091
00092 void SetUserData(void *userData);
00093 void *UserData();
00094
00095 operator class UFNumber&();
00097 operator const class UFNumber&() const;
00099 operator class UFNumberArray&();
00101 operator const class UFNumberArray&() const;
00103 operator class UFString&();
00105 operator const class UFString&() const;
00107 operator class UFGroup&();
00109 operator const class UFGroup&() const;
00111 operator class UFArray&();
00113 operator const class UFArray&() const;
00114 bool HasParent() const;
00115
00116
00117
00118
00119 UFGroup &Parent() const;
00122 virtual const char *StringValue() const;
00126 virtual std::string XML(const char *indent = "") const;
00133 virtual void Message(const char *format, ...) const;
00137 void Throw(const char *format, ...) const;
00143 virtual void Set(const UFObject &object) = 0;
00150 virtual void Set(const char *string) = 0;
00153 virtual bool IsDefault() const = 0;
00156 virtual void SetDefault() = 0;
00159 virtual void Reset() = 0;
00162 void SetEventHandle(UFEventHandle *handle);
00168 virtual void Event(UFEventType type);
00175 virtual void OriginalValueChangedEvent();
00176 protected:
00178 class _UFObject *const ufobject;
00181 explicit UFObject(_UFObject *object);
00182 private:
00183 UFObject(const UFObject &);
00184 UFObject &operator=(const UFObject &);
00185 };
00186
00191 class UFNumber : public UFObject {
00192 public:
00205 UFNumber(UFName name, double minimum, double maximum, double defaultValue,
00206 int accuracyDigits = -1, double step = 0.0, double jump = 0.0);
00207 const char *StringValue() const;
00213 double DoubleValue() const;
00214 void Set(const UFObject &object);
00215 void Set(const char *string);
00219 void Set(double number);
00220 bool IsDefault() const;
00221 void SetDefault();
00222 void Reset();
00225 bool IsEqual(double number) const;
00226 double Minimum() const;
00227 double Maximum() const;
00228 int AccuracyDigits() const;
00229 double Step() const;
00230 double Jump() const;
00231 };
00232
00236 class UFNumberArray : public UFObject {
00237 public:
00250 UFNumberArray(UFName name, int size, double minimum, double maximum,
00251 double defaultValue, int accuracyDigits = 0xff, double step = 0.0,
00252 double jump = 0.0);
00253 const char *StringValue() const;
00259 double DoubleValue(int index) const;
00260 void Set(const UFObject &object);
00261 void Set(const char *string);
00267 void Set(int index, double number);
00271 void Set(const double array[]);
00272 bool IsDefault() const;
00273 void SetDefault();
00274 void Reset();
00279 bool IsEqual(int index, double number) const;
00280 int Size() const;
00281 double Minimum() const;
00282 double Maximum() const;
00283 int AccuracyDigits() const;
00284 double Step() const;
00285 double Jump() const;
00286 };
00287
00291 class UFString : public UFObject {
00292 public:
00294 explicit UFString(UFName name, const char *defaultValue = "");
00295 void Set(const UFObject &object);
00296 void Set(const char *string);
00297 bool IsDefault() const;
00298 void SetDefault();
00301 void SetDefault(const char *string);
00302 void Reset();
00304 bool IsEqual(const char *string) const;
00305 };
00306
00311 class UFGroup : public UFObject {
00312 public:
00315 explicit UFGroup(UFName name, const char *label = "");
00317 ~UFGroup();
00318 std::string XML(const char *indent = "") const;
00319 void Set(const UFObject &object);
00320 void Set(const char *string);
00321 bool IsDefault() const;
00322 void SetDefault();
00323 void Reset();
00325 bool Has(UFName name) const;
00329 UFObject &operator[](UFName name);
00333 const UFObject &operator[](UFName name) const;
00339 virtual UFGroup &operator<<(UFObject *object);
00345 UFObject &Drop(UFName name);
00349 void Clear();
00350 };
00351
00358 class UFArray : public UFGroup {
00359 public:
00361 explicit UFArray(UFName name, const char *defaultIndex = "");
00362 std::string XML(const char *indent = "") const;
00363 void Set(const UFObject &object);
00364 void Set(const char *string);
00365 const char *StringValue() const;
00366 bool IsDefault() const;
00367 void SetDefault();
00372 void SetDefault(const char *string);
00373 void Reset();
00376 bool SetIndex(int index);
00379 int Index() const;
00381 bool IsEqual(const char *string) const;
00387 UFArray &operator<<(UFObject *object);
00388 };
00389
00394 class UFException : public std::runtime_error {
00395 public:
00396 explicit UFException(std::string &Message);
00397 };
00398
00399 #endif
00400
00401
00402
00403
00404
00405 typedef int UFBoolean;
00406 #define UF_FALSE (0)
00407 #define UF_TRUE (!UF_FALSE)
00408
00409 #ifdef __cplusplus
00410 extern "C" {
00411 #endif
00412
00414 UFObject *ufobject_delete(UFObject *object);
00416 UFName ufobject_name(UFObject *object);
00417 UFObject *ufobject_parent(UFObject *object);
00419 const char *ufobject_string_value(UFObject *object);
00423 UFBoolean ufobject_set_string(UFObject *object, const char *string);
00427 UFBoolean ufobject_copy(UFObject *destination, UFObject *source);
00430 char *ufobject_xml(UFObject *object, const char *indent);
00431 void *ufobject_user_data(UFObject *object);
00432 void ufobject_set_user_data(UFObject *object, void *user_data);
00433 void ufobject_set_changed_event_handle(UFObject *object,
00434 UFEventHandle *handle);
00436 void ufobject_set_default(UFObject *object);
00439 double ufnumber_value(UFObject *object);
00443 UFBoolean ufnumber_set(UFObject *object, double number);
00447 double ufnumber_array_value(UFObject *object, int index);
00451 UFBoolean ufnumber_array_set(UFObject *object, const double array[]);
00455 UFBoolean ufstring_is_equal(UFObject *object, const char *string);
00459 UFBoolean ufgroup_has(UFObject *object, UFName name);
00462 UFObject *ufgroup_element(UFObject *object, UFName name);
00465 UFBoolean ufgroup_add(UFObject *group, UFObject *object);
00468 UFObject *ufgroup_drop(UFObject *group, UFName name);
00470 UFBoolean ufarray_set_index(UFObject *object, int index);
00473 int ufarray_index(UFObject *object);
00477 UFBoolean ufarray_is_equal(UFObject *object, const char *string);
00478
00479 #ifdef __cplusplus
00480 }
00481 #endif
00482
00483 #endif