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