aboutsummaryrefslogtreecommitdiffstats
path: root/include/utils/SkJSON.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/utils/SkJSON.h')
-rw-r--r--include/utils/SkJSON.h285
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