diff options
author | 2012-01-04 03:37:40 +0000 | |
---|---|---|
committer | 2012-01-04 03:37:40 +0000 | |
commit | e4058b402f195a38da2d9bc2d98a88a415fe4a19 (patch) | |
tree | d0d5a772105932bb8dcddb35648afb415a6ad544 /include/utils | |
parent | 0b71f6cedd57de177b8368c48dfaab14feda9677 (diff) |
add Object::remove, some dox, leak debugging code
git-svn-id: http://skia.googlecode.com/svn/trunk@2957 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'include/utils')
-rw-r--r-- | include/utils/SkJSON.h | 210 |
1 files changed, 196 insertions, 14 deletions
diff --git a/include/utils/SkJSON.h b/include/utils/SkJSON.h index 44826ace74..215d54a604 100644 --- a/include/utils/SkJSON.h +++ b/include/utils/SkJSON.h @@ -10,6 +10,7 @@ #include "SkTypes.h" +class SkStream; class SkString; class SkJSON { @@ -26,34 +27,151 @@ public: class Array; class Object { + private: + struct Slot; + public: - Object() : fHead(NULL), fTail(NULL) {} + Object(); Object(const Object&); ~Object(); - + + /** + * Create a new slot with the specified name and value. The name + * parameter is copied, but ownership of the Object parameter is + * transferred. The Object parameter may be null, but the name must + * not be null. + */ void addObject(const char name[], Object* value); + + /** + * Create a new slot with the specified name and value. The name + * parameter is copied, but ownership of the Array parameter is + * transferred. The Array parameter may be null, but the name must + * not be null. + */ void addArray(const char name[], Array* value); + + /** + * Create a new slot with the specified name and value. Both parameters + * are copied. The value parameter may be null, but the name must + * not be null. + */ void addString(const char name[], const char value[]); + + /** + * Create a new slot with the specified name and value. The name + * parameter is copied, and must not be null. + */ void addInt(const char name[], int32_t value); + + /** + * Create a new slot with the specified name and value. The name + * parameter is copied, and must not be null. + */ void addFloat(const char name[], float value); - void addBool(const char name[], bool value); + /** + * Create a new slot with the specified name and value. The name + * parameter is copied, and must not be null. + */ + void addBool(const char name[], bool value); + + /** + * Returns true if a slot matching the name and Type is found. + */ + bool find(const char name[], Type) const; bool findObject(const char name[], Object** = NULL) const; bool findArray(const char name[], Array** = NULL) const; bool findString(const char name[], SkString* = NULL) const; bool findInt(const char name[], int32_t* = NULL) const; bool findFloat(const char name[], float* = NULL) const; bool findBool(const char name[], bool* = NULL) const; - - void dump() const; - + + /** + * Finds the first slot matching the name and Type and removes it. + * Returns true if found, false if not. + */ + bool remove(const char name[], Type); + + void toDebugf() const; + + /** + * Iterator class which returns all of the fields/slots in an Object, + * in the order that they were added. + */ + class Iter { + public: + Iter(const Object&); + + /** + * Returns true when there are no more entries in the iterator. + * In this case, no other methods should be called. + */ + bool done() const; + + /** + * Moves the iterator to the next element. Should only be called + * if done() returns false. + */ + void next(); + + /** + * Returns the type of the current element. Should only be called + * if done() returns false. + */ + Type type() const; + + /** + * Returns the name of the current element. Should only be called + * if done() returns false. + */ + const char* name() const; + + /** + * Returns the type of the current element. Should only be called + * if done() returns false and type() returns kObject. + */ + Object* objectValue() const; + + /** + * Returns the type of the current element. Should only be called + * if done() returns false and type() returns kArray. + */ + Array* arrayValue() const; + + /** + * Returns the type of the current element. Should only be called + * if done() returns false and type() returns kString. + */ + const char* stringValue() const; + + /** + * Returns the type of the current element. Should only be called + * if done() returns false and type() returns kInt. + */ + int32_t intValue() const; + + /** + * Returns the type of the current element. Should only be called + * if done() returns false and type() returns kFloat. + */ + float floatValue() const; + + /** + * Returns the type of the current element. Should only be called + * if done() returns false and type() returns kBool. + */ + bool boolValue() const; + + private: + Slot* fSlot; + }; + private: - struct Slot; Slot* fHead; Slot* fTail; - const Slot* findSlot(const char name[]) const; - const Slot* findSlotAndType(const char name[], Type) const; + const Slot* findSlot(const char name[], Type) const; Slot* addSlot(Slot*); void dumpLevel(int level) const; @@ -62,26 +180,90 @@ public: class Array { public: - // do I support strings, objects, arrays? + /** + * Creates an array with the specified Type and element count. All + * entries are initialized to NULL/0/false. + */ Array(Type, int count); + + /** + * Creates an array of ints, initialized by copying the specified + * values. + */ Array(const int32_t values[], int count); + + /** + * Creates an array of floats, initialized by copying the specified + * values. + */ Array(const float values[], int count); + + /** + * Creates an array of bools, initialized by copying the specified + * values. + */ Array(const bool values[], int count); + Array(const Array&); ~Array(); int count() const { return fCount; } Type type() const { return fType; } + + /** + * Replace the element at the specified index with the specified + * Object (which may be null). Ownership of the Object is transferred. + * Should only be called if the Array's type is kObject. + */ + void setObject(int index, Object*); - int32_t* ints() const { return fArray.fInts; } - float* floats() const { return fArray.fFloats; } - bool* bools() const { return fArray.fBools; } - + /** + * Replace the element at the specified index with the specified + * Array (which may be null). Ownership of the Array is transferred. + * Should only be called if the Array's type is kArray. + */ + void setArray(int index, Array*); + + /** + * Replace the element at the specified index with a copy of the + * specified string (which may be null). Should only be called if the + * Array's type is kString. + */ + void setString(int index, const char str[]); + + Object* const* objects() const { + SkASSERT(kObject == fType); + return fArray.fObjects; + } + Array* const* arrays() const { + SkASSERT(kObject == fType); + return fArray.fArrays; + } + const char* const* strings() const { + SkASSERT(kString == fType); + return fArray.fStrings; + } + int32_t* ints() const { + SkASSERT(kInt == fType); + return fArray.fInts; + } + float* floats() const { + SkASSERT(kFloat == fType); + return fArray.fFloats; + } + bool* bools() const { + SkASSERT(kBool == fType); + return fArray.fBools; + } + private: int fCount; Type fType; union { void* fVoids; + Object** fObjects; + Array** fArrays; + char** fStrings; int32_t* fInts; float* fFloats; bool* fBools; |