| /* | |
| * 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 |