diff options
Diffstat (limited to 'include/utils/SkJSON.h')
-rw-r--r-- | include/utils/SkJSON.h | 285 |
1 files changed, 285 insertions, 0 deletions
diff --git a/include/utils/SkJSON.h b/include/utils/SkJSON.h new file mode 100644 index 0000000..5268af5 --- /dev/null +++ b/include/utils/SkJSON.h @@ -0,0 +1,285 @@ +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkJSON_DEFINED +#define SkJSON_DEFINED + +#include "SkTypes.h" + +class SkStream; +class SkString; + +class SkJSON { +public: + enum Type { + kObject, + kArray, + kString, + kInt, + kFloat, + kBool, + }; + + class Array; + + class Object { + private: + struct Slot; + + public: + 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); + + /** + * 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); + + /** + * Return the number of slots/fields in this object. These can be + * iterated using Iter. + */ + int count() const; + + /** + * 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; + + /** + * 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: + Slot* fHead; + Slot* fTail; + + const Slot* findSlot(const char name[], Type) const; + Slot* addSlot(Slot*); + void dumpLevel(int level) const; + + friend class Array; + }; + + class Array { + public: + /** + * 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*); + + /** + * 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; + } fArray; + + void init(Type, int count, const void* src); + void dumpLevel(int level) const; + + friend class Object; + }; +}; + +#endif |