http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/example/parsebyparts/parsebyparts.cpp
----------------------------------------------------------------------
diff --git a/thirdparty/rapidjson-1.1.0/example/parsebyparts/parsebyparts.cpp 
b/thirdparty/rapidjson-1.1.0/example/parsebyparts/parsebyparts.cpp
new file mode 100644
index 0000000..57eed00
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/example/parsebyparts/parsebyparts.cpp
@@ -0,0 +1,173 @@
+// Example of parsing JSON to document by parts.
+
+// Using C++11 threads
+// Temporarily disable for clang (older version) due to incompatibility with 
libstdc++
+#if (__cplusplus >= 201103L || (defined(_MSC_VER) && _MSC_VER >= 1700)) && 
!defined(__clang__)
+
+#include "rapidjson/document.h"
+#include "rapidjson/error/en.h"
+#include "rapidjson/writer.h"
+#include "rapidjson/ostreamwrapper.h"
+#include <condition_variable>
+#include <iostream>
+#include <mutex>
+#include <thread>
+
+using namespace rapidjson;
+
+template<unsigned parseFlags = kParseDefaultFlags>
+class AsyncDocumentParser {
+public:
+    AsyncDocumentParser(Document& d)
+        : stream_(*this)
+        , d_(d)
+        , parseThread_(&AsyncDocumentParser::Parse, this)
+        , mutex_()
+        , notEmpty_()
+        , finish_()
+        , completed_()
+    {}
+
+    ~AsyncDocumentParser() {
+        if (!parseThread_.joinable())
+            return;
+
+        {        
+            std::unique_lock<std::mutex> lock(mutex_);
+
+            // Wait until the buffer is read up (or parsing is completed)
+            while (!stream_.Empty() && !completed_)
+                finish_.wait(lock);
+
+            // Automatically append '\0' as the terminator in the stream.
+            static const char terminator[] = "";
+            stream_.src_ = terminator;
+            stream_.end_ = terminator + 1;
+            notEmpty_.notify_one(); // unblock the AsyncStringStream
+        }
+
+        parseThread_.join();
+    }
+
+    void ParsePart(const char* buffer, size_t length) {
+        std::unique_lock<std::mutex> lock(mutex_);
+        
+        // Wait until the buffer is read up (or parsing is completed)
+        while (!stream_.Empty() && !completed_)
+            finish_.wait(lock);
+
+        // Stop further parsing if the parsing process is completed.
+        if (completed_)
+            return;
+
+        // Set the buffer to stream and unblock the AsyncStringStream
+        stream_.src_ = buffer;
+        stream_.end_ = buffer + length;
+        notEmpty_.notify_one();
+    }
+
+private:
+    void Parse() {
+        d_.ParseStream<parseFlags>(stream_);
+
+        // The stream may not be fully read, notify finish anyway to unblock 
ParsePart()
+        std::unique_lock<std::mutex> lock(mutex_);
+        completed_ = true;      // Parsing process is completed
+        finish_.notify_one();   // Unblock ParsePart() or destructor if they 
are waiting.
+    }
+
+    struct AsyncStringStream {
+        typedef char Ch;
+
+        AsyncStringStream(AsyncDocumentParser& parser) : parser_(parser), 
src_(), end_(), count_() {}
+
+        char Peek() const {
+            std::unique_lock<std::mutex> lock(parser_.mutex_);
+
+            // If nothing in stream, block to wait.
+            while (Empty())
+                parser_.notEmpty_.wait(lock);
+
+            return *src_;
+        }
+
+        char Take() {
+            std::unique_lock<std::mutex> lock(parser_.mutex_);
+
+            // If nothing in stream, block to wait.
+            while (Empty())
+                parser_.notEmpty_.wait(lock);
+
+            count_++;
+            char c = *src_++;
+
+            // If all stream is read up, notify that the stream is finish.
+            if (Empty())
+                parser_.finish_.notify_one();
+
+            return c;
+        }
+
+        size_t Tell() const { return count_; }
+
+        // Not implemented
+        char* PutBegin() { return 0; }
+        void Put(char) {}
+        void Flush() {}
+        size_t PutEnd(char*) { return 0; }
+
+        bool Empty() const { return src_ == end_; }
+
+        AsyncDocumentParser& parser_;
+        const char* src_;     //!< Current read position.
+        const char* end_;     //!< End of buffer
+        size_t count_;        //!< Number of characters taken so far.
+    };
+
+    AsyncStringStream stream_;
+    Document& d_;
+    std::thread parseThread_;
+    std::mutex mutex_;
+    std::condition_variable notEmpty_;
+    std::condition_variable finish_;
+    bool completed_;
+};
+
+int main() {
+    Document d;
+
+    {
+        AsyncDocumentParser<> parser(d);
+
+        const char json1[] = " { \"hello\" : \"world\", \"t\" : tr";
+        //const char json1[] = " { \"hello\" : \"world\", \"t\" : trX"; // Fot 
test parsing error
+        const char json2[] = "ue, \"f\" : false, \"n\": null, \"i\":123, 
\"pi\": 3.14";
+        const char json3[] = "16, \"a\":[1, 2, 3, 4] } ";
+
+        parser.ParsePart(json1, sizeof(json1) - 1);
+        parser.ParsePart(json2, sizeof(json2) - 1);
+        parser.ParsePart(json3, sizeof(json3) - 1);
+    }
+
+    if (d.HasParseError()) {
+        std::cout << "Error at offset " << d.GetErrorOffset() << ": " << 
GetParseError_En(d.GetParseError()) << std::endl;
+        return EXIT_FAILURE;
+    }
+    
+    // Stringify the JSON to cout
+    OStreamWrapper os(std::cout);
+    Writer<OStreamWrapper> writer(os);
+    d.Accept(writer);
+    std::cout << std::endl;
+
+    return EXIT_SUCCESS;
+}
+
+#else // Not supporting C++11 
+
+#include <iostream>
+int main() {
+    std::cout << "This example requires C++11 compiler" << std::endl;
+}
+
+#endif

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/example/pretty/pretty.cpp
----------------------------------------------------------------------
diff --git a/thirdparty/rapidjson-1.1.0/example/pretty/pretty.cpp 
b/thirdparty/rapidjson-1.1.0/example/pretty/pretty.cpp
new file mode 100644
index 0000000..2feff5d
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/example/pretty/pretty.cpp
@@ -0,0 +1,30 @@
+// JSON pretty formatting example
+// This example can only handle UTF-8. For handling other encodings, see 
prettyauto example.
+
+#include "rapidjson/reader.h"
+#include "rapidjson/prettywriter.h"
+#include "rapidjson/filereadstream.h"
+#include "rapidjson/filewritestream.h"
+#include "rapidjson/error/en.h"
+
+using namespace rapidjson;
+
+int main(int, char*[]) {
+    // Prepare reader and input stream.
+    Reader reader;
+    char readBuffer[65536];
+    FileReadStream is(stdin, readBuffer, sizeof(readBuffer));
+
+    // Prepare writer and output stream.
+    char writeBuffer[65536];
+    FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer));
+    PrettyWriter<FileWriteStream> writer(os);
+
+    // JSON reader parse from the input stream and let writer generate the 
output.
+    if (!reader.Parse<kParseValidateEncodingFlag>(is, writer)) {
+        fprintf(stderr, "\nError(%u): %s\n", 
static_cast<unsigned>(reader.GetErrorOffset()), 
GetParseError_En(reader.GetParseErrorCode()));
+        return 1;
+    }
+
+    return 0;
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/example/prettyauto/prettyauto.cpp
----------------------------------------------------------------------
diff --git a/thirdparty/rapidjson-1.1.0/example/prettyauto/prettyauto.cpp 
b/thirdparty/rapidjson-1.1.0/example/prettyauto/prettyauto.cpp
new file mode 100644
index 0000000..1687bae
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/example/prettyauto/prettyauto.cpp
@@ -0,0 +1,56 @@
+// JSON pretty formatting example
+// This example can handle UTF-8/UTF-16LE/UTF-16BE/UTF-32LE/UTF-32BE.
+// The input firstly convert to UTF8, and then write to the original encoding 
with pretty formatting.
+
+#include "rapidjson/reader.h"
+#include "rapidjson/prettywriter.h"
+#include "rapidjson/filereadstream.h"
+#include "rapidjson/filewritestream.h"
+#include "rapidjson/encodedstream.h"    // NEW
+#include "rapidjson/error/en.h"
+#ifdef _WIN32
+#include <fcntl.h>
+#include <io.h>
+#endif
+
+using namespace rapidjson;
+
+int main(int, char*[]) {
+#ifdef _WIN32
+    // Prevent Windows converting between CR+LF and LF
+    _setmode(_fileno(stdin), _O_BINARY);    // NEW
+    _setmode(_fileno(stdout), _O_BINARY);   // NEW
+#endif
+
+    // Prepare reader and input stream.
+    //Reader reader;
+    GenericReader<AutoUTF<unsigned>, UTF8<> > reader;       // CHANGED
+    char readBuffer[65536];
+    FileReadStream is(stdin, readBuffer, sizeof(readBuffer));
+    AutoUTFInputStream<unsigned, FileReadStream> eis(is);   // NEW
+
+    // Prepare writer and output stream.
+    char writeBuffer[65536];
+    FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer));
+
+#if 1
+    // Use the same Encoding of the input. Also use BOM according to input.
+    typedef AutoUTFOutputStream<unsigned, FileWriteStream> OutputStream;    // 
NEW
+    OutputStream eos(os, eis.GetType(), eis.HasBOM());                      // 
NEW
+    PrettyWriter<OutputStream, UTF8<>, AutoUTF<unsigned> > writer(eos);     // 
CHANGED
+#else
+    // You may also use static bound encoding type, such as output to UTF-16LE 
with BOM
+    typedef EncodedOutputStream<UTF16LE<>,FileWriteStream> OutputStream;    // 
NEW
+    OutputStream eos(os, true);                                             // 
NEW
+    PrettyWriter<OutputStream, UTF8<>, UTF16LE<> > writer(eos);             // 
CHANGED
+#endif
+
+    // JSON reader parse from the input stream and let writer generate the 
output.
+    //if (!reader.Parse<kParseValidateEncodingFlag>(is, writer)) {
+    if (!reader.Parse<kParseValidateEncodingFlag>(eis, writer)) {   // CHANGED
+        fprintf(stderr, "\nError(%u): %s\n", 
static_cast<unsigned>(reader.GetErrorOffset()), 
GetParseError_En(reader.GetParseErrorCode()));
+        return 1;
+    }
+
+    return 0;
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/example/schemavalidator/schemavalidator.cpp
----------------------------------------------------------------------
diff --git 
a/thirdparty/rapidjson-1.1.0/example/schemavalidator/schemavalidator.cpp 
b/thirdparty/rapidjson-1.1.0/example/schemavalidator/schemavalidator.cpp
new file mode 100644
index 0000000..ce36ea9
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/example/schemavalidator/schemavalidator.cpp
@@ -0,0 +1,72 @@
+// Schema Validator example
+
+// The example validates JSON text from stdin with a JSON schema specified in 
the argument.
+
+#include "rapidjson/error/en.h"
+#include "rapidjson/filereadstream.h"
+#include "rapidjson/schema.h"
+#include "rapidjson/stringbuffer.h"
+
+using namespace rapidjson;
+
+int main(int argc, char *argv[]) {
+    if (argc != 2) {
+        fprintf(stderr, "Usage: schemavalidator schema.json < input.json\n");
+        return EXIT_FAILURE;
+    }
+
+    // Read a JSON schema from file into Document
+    Document d;
+    char buffer[4096];
+
+    {
+        FILE *fp = fopen(argv[1], "r");
+        if (!fp) {
+            printf("Schema file '%s' not found\n", argv[1]);
+            return -1;
+        }
+        FileReadStream fs(fp, buffer, sizeof(buffer));
+        d.ParseStream(fs);
+        if (d.HasParseError()) {
+            fprintf(stderr, "Schema file '%s' is not a valid JSON\n", argv[1]);
+            fprintf(stderr, "Error(offset %u): %s\n",
+                static_cast<unsigned>(d.GetErrorOffset()),
+                GetParseError_En(d.GetParseError()));
+            fclose(fp);
+            return EXIT_FAILURE;
+        }
+        fclose(fp);
+    }
+    
+    // Then convert the Document into SchemaDocument
+    SchemaDocument sd(d);
+
+    // Use reader to parse the JSON in stdin, and forward SAX events to 
validator
+    SchemaValidator validator(sd);
+    Reader reader;
+    FileReadStream is(stdin, buffer, sizeof(buffer));
+    if (!reader.Parse(is, validator) && reader.GetParseErrorCode() != 
kParseErrorTermination) {
+        // Schema validator error would cause kParseErrorTermination, which 
will handle it in next step.
+        fprintf(stderr, "Input is not a valid JSON\n");
+        fprintf(stderr, "Error(offset %u): %s\n",
+            static_cast<unsigned>(reader.GetErrorOffset()),
+            GetParseError_En(reader.GetParseErrorCode()));
+    }
+
+    // Check the validation result
+    if (validator.IsValid()) {
+        printf("Input JSON is valid.\n");
+        return EXIT_SUCCESS;
+    }
+    else {
+        printf("Input JSON is invalid.\n");
+        StringBuffer sb;
+        validator.GetInvalidSchemaPointer().StringifyUriFragment(sb);
+        fprintf(stderr, "Invalid schema: %s\n", sb.GetString());
+        fprintf(stderr, "Invalid keyword: %s\n", 
validator.GetInvalidSchemaKeyword());
+        sb.Clear();
+        validator.GetInvalidDocumentPointer().StringifyUriFragment(sb);
+        fprintf(stderr, "Invalid document: %s\n", sb.GetString());
+        return EXIT_FAILURE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/example/serialize/serialize.cpp
----------------------------------------------------------------------
diff --git a/thirdparty/rapidjson-1.1.0/example/serialize/serialize.cpp 
b/thirdparty/rapidjson-1.1.0/example/serialize/serialize.cpp
new file mode 100644
index 0000000..12d8715
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/example/serialize/serialize.cpp
@@ -0,0 +1,173 @@
+// Serialize example
+// This example shows writing JSON string with writer directly.
+
+#include "rapidjson/prettywriter.h" // for stringify JSON
+#include <cstdio>
+#include <string>
+#include <vector>
+
+using namespace rapidjson;
+
+class Person {
+public:
+    Person(const std::string& name, unsigned age) : name_(name), age_(age) {}
+    Person(const Person& rhs) : name_(rhs.name_), age_(rhs.age_) {}
+    virtual ~Person();
+
+    Person& operator=(const Person& rhs) {
+        name_ = rhs.name_;
+        age_ = rhs.age_;
+        return *this;
+    }
+
+protected:
+    template <typename Writer>
+    void Serialize(Writer& writer) const {
+        // This base class just write out name-value pairs, without wrapping 
within an object.
+        writer.String("name");
+#if RAPIDJSON_HAS_STDSTRING
+        writer.String(name_);
+#else
+        writer.String(name_.c_str(), static_cast<SizeType>(name_.length())); 
// Supplying length of string is faster.
+#endif
+        writer.String("age");
+        writer.Uint(age_);
+    }
+
+private:
+    std::string name_;
+    unsigned age_;
+};
+
+Person::~Person() {
+}
+
+class Education {
+public:
+    Education(const std::string& school, double GPA) : school_(school), 
GPA_(GPA) {}
+    Education(const Education& rhs) : school_(rhs.school_), GPA_(rhs.GPA_) {}
+
+    template <typename Writer>
+    void Serialize(Writer& writer) const {
+        writer.StartObject();
+        
+        writer.String("school");
+#if RAPIDJSON_HAS_STDSTRING
+        writer.String(school_);
+#else
+        writer.String(school_.c_str(), 
static_cast<SizeType>(school_.length()));
+#endif
+
+        writer.String("GPA");
+        writer.Double(GPA_);
+
+        writer.EndObject();
+    }
+
+private:
+    std::string school_;
+    double GPA_;
+};
+
+class Dependent : public Person {
+public:
+    Dependent(const std::string& name, unsigned age, Education* education = 0) 
: Person(name, age), education_(education) {}
+    Dependent(const Dependent& rhs) : Person(rhs), education_(0) { education_ 
= (rhs.education_ == 0) ? 0 : new Education(*rhs.education_); }
+    virtual ~Dependent();
+
+    Dependent& operator=(const Dependent& rhs) {
+        if (this == &rhs)
+            return *this;
+        delete education_;
+        education_ = (rhs.education_ == 0) ? 0 : new 
Education(*rhs.education_);
+        return *this;
+    }
+
+    template <typename Writer>
+    void Serialize(Writer& writer) const {
+        writer.StartObject();
+
+        Person::Serialize(writer);
+
+        writer.String("education");
+        if (education_)
+            education_->Serialize(writer);
+        else
+            writer.Null();
+
+        writer.EndObject();
+    }
+
+private:
+
+    Education *education_;
+};
+
+Dependent::~Dependent() {
+    delete education_; 
+}
+
+class Employee : public Person {
+public:
+    Employee(const std::string& name, unsigned age, bool married) : 
Person(name, age), dependents_(), married_(married) {}
+    Employee(const Employee& rhs) : Person(rhs), dependents_(rhs.dependents_), 
married_(rhs.married_) {}
+    virtual ~Employee();
+
+    Employee& operator=(const Employee& rhs) {
+        static_cast<Person&>(*this) = rhs;
+        dependents_ = rhs.dependents_;
+        married_ = rhs.married_;
+        return *this;
+    }
+
+    void AddDependent(const Dependent& dependent) {
+        dependents_.push_back(dependent);
+    }
+
+    template <typename Writer>
+    void Serialize(Writer& writer) const {
+        writer.StartObject();
+
+        Person::Serialize(writer);
+
+        writer.String("married");
+        writer.Bool(married_);
+
+        writer.String(("dependents"));
+        writer.StartArray();
+        for (std::vector<Dependent>::const_iterator dependentItr = 
dependents_.begin(); dependentItr != dependents_.end(); ++dependentItr)
+            dependentItr->Serialize(writer);
+        writer.EndArray();
+
+        writer.EndObject();
+    }
+
+private:
+    std::vector<Dependent> dependents_;
+    bool married_;
+};
+
+Employee::~Employee() {
+}
+
+int main(int, char*[]) {
+    std::vector<Employee> employees;
+
+    employees.push_back(Employee("Milo YIP", 34, true));
+    employees.back().AddDependent(Dependent("Lua YIP", 3, new Education("Happy 
Kindergarten", 3.5)));
+    employees.back().AddDependent(Dependent("Mio YIP", 1));
+
+    employees.push_back(Employee("Percy TSE", 30, false));
+
+    StringBuffer sb;
+    PrettyWriter<StringBuffer> writer(sb);
+
+    writer.StartArray();
+    for (std::vector<Employee>::const_iterator employeeItr = 
employees.begin(); employeeItr != employees.end(); ++employeeItr)
+        employeeItr->Serialize(writer);
+    writer.EndArray();
+
+    puts(sb.GetString());
+
+    return 0;
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/example/simpledom/simpledom.cpp
----------------------------------------------------------------------
diff --git a/thirdparty/rapidjson-1.1.0/example/simpledom/simpledom.cpp 
b/thirdparty/rapidjson-1.1.0/example/simpledom/simpledom.cpp
new file mode 100644
index 0000000..8038419
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/example/simpledom/simpledom.cpp
@@ -0,0 +1,29 @@
+// JSON simple example
+// This example does not handle errors.
+
+#include "rapidjson/document.h"
+#include "rapidjson/writer.h"
+#include "rapidjson/stringbuffer.h"
+#include <iostream>
+
+using namespace rapidjson;
+
+int main() {
+    // 1. Parse a JSON string into DOM.
+    const char* json = "{\"project\":\"rapidjson\",\"stars\":10}";
+    Document d;
+    d.Parse(json);
+
+    // 2. Modify it by DOM.
+    Value& s = d["stars"];
+    s.SetInt(s.GetInt() + 1);
+
+    // 3. Stringify the DOM
+    StringBuffer buffer;
+    Writer<StringBuffer> writer(buffer);
+    d.Accept(writer);
+
+    // Output {"project":"rapidjson","stars":11}
+    std::cout << buffer.GetString() << std::endl;
+    return 0;
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/example/simplereader/simplereader.cpp
----------------------------------------------------------------------
diff --git a/thirdparty/rapidjson-1.1.0/example/simplereader/simplereader.cpp 
b/thirdparty/rapidjson-1.1.0/example/simplereader/simplereader.cpp
new file mode 100644
index 0000000..5aae8a1
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/example/simplereader/simplereader.cpp
@@ -0,0 +1,42 @@
+#include "rapidjson/reader.h"
+#include <iostream>
+
+using namespace rapidjson;
+using namespace std;
+
+struct MyHandler {
+    bool Null() { cout << "Null()" << endl; return true; }
+    bool Bool(bool b) { cout << "Bool(" << boolalpha << b << ")" << endl; 
return true; }
+    bool Int(int i) { cout << "Int(" << i << ")" << endl; return true; }
+    bool Uint(unsigned u) { cout << "Uint(" << u << ")" << endl; return true; }
+    bool Int64(int64_t i) { cout << "Int64(" << i << ")" << endl; return true; 
}
+    bool Uint64(uint64_t u) { cout << "Uint64(" << u << ")" << endl; return 
true; }
+    bool Double(double d) { cout << "Double(" << d << ")" << endl; return 
true; }
+    bool RawNumber(const char* str, SizeType length, bool copy) { 
+        cout << "Number(" << str << ", " << length << ", " << boolalpha << 
copy << ")" << endl;
+        return true;
+    }
+    bool String(const char* str, SizeType length, bool copy) { 
+        cout << "String(" << str << ", " << length << ", " << boolalpha << 
copy << ")" << endl;
+        return true;
+    }
+    bool StartObject() { cout << "StartObject()" << endl; return true; }
+    bool Key(const char* str, SizeType length, bool copy) {
+        cout << "Key(" << str << ", " << length << ", " << boolalpha << copy 
<< ")" << endl;
+        return true;
+    }
+    bool EndObject(SizeType memberCount) { cout << "EndObject(" << memberCount 
<< ")" << endl; return true; }
+    bool StartArray() { cout << "StartArray()" << endl; return true; }
+    bool EndArray(SizeType elementCount) { cout << "EndArray(" << elementCount 
<< ")" << endl; return true; }
+};
+
+int main() {
+    const char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : 
false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } ";
+
+    MyHandler handler;
+    Reader reader;
+    StringStream ss(json);
+    reader.Parse(ss, handler);
+
+    return 0;
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/example/simplewriter/simplewriter.cpp
----------------------------------------------------------------------
diff --git a/thirdparty/rapidjson-1.1.0/example/simplewriter/simplewriter.cpp 
b/thirdparty/rapidjson-1.1.0/example/simplewriter/simplewriter.cpp
new file mode 100644
index 0000000..8d1275c
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/example/simplewriter/simplewriter.cpp
@@ -0,0 +1,36 @@
+#include "rapidjson/writer.h"
+#include "rapidjson/stringbuffer.h"
+#include <iostream>
+
+using namespace rapidjson;
+using namespace std;
+
+int main() {
+    StringBuffer s;
+    Writer<StringBuffer> writer(s);
+    
+    writer.StartObject();               // Between StartObject()/EndObject(), 
+    writer.Key("hello");                // output a key,
+    writer.String("world");             // follow by a value.
+    writer.Key("t");
+    writer.Bool(true);
+    writer.Key("f");
+    writer.Bool(false);
+    writer.Key("n");
+    writer.Null();
+    writer.Key("i");
+    writer.Uint(123);
+    writer.Key("pi");
+    writer.Double(3.1416);
+    writer.Key("a");
+    writer.StartArray();                // Between StartArray()/EndArray(),
+    for (unsigned i = 0; i < 4; i++)
+        writer.Uint(i);                 // all values are elements of the 
array.
+    writer.EndArray();
+    writer.EndObject();
+
+    // 
{"hello":"world","t":true,"f":false,"n":null,"i":123,"pi":3.1416,"a":[0,1,2,3]}
+    cout << s.GetString() << endl;
+
+    return 0;
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/example/tutorial/tutorial.cpp
----------------------------------------------------------------------
diff --git a/thirdparty/rapidjson-1.1.0/example/tutorial/tutorial.cpp 
b/thirdparty/rapidjson-1.1.0/example/tutorial/tutorial.cpp
new file mode 100644
index 0000000..c8bfcc1
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/example/tutorial/tutorial.cpp
@@ -0,0 +1,151 @@
+// Hello World example
+// This example shows basic usage of DOM-style API.
+
+#include "rapidjson/document.h"     // rapidjson's DOM-style API
+#include "rapidjson/prettywriter.h" // for stringify JSON
+#include <cstdio>
+
+using namespace rapidjson;
+using namespace std;
+
+int main(int, char*[]) {
+    
////////////////////////////////////////////////////////////////////////////
+    // 1. Parse a JSON text string to a document.
+
+    const char json[] = " { \"hello\" : \"world\", \"t\" : true , \"f\" : 
false, \"n\": null, \"i\":123, \"pi\": 3.1416, \"a\":[1, 2, 3, 4] } ";
+    printf("Original JSON:\n %s\n", json);
+
+    Document document;  // Default template parameter uses UTF8 and 
MemoryPoolAllocator.
+
+#if 0
+    // "normal" parsing, decode strings to new buffers. Can use other input 
stream via ParseStream().
+    if (document.Parse(json).HasParseError())
+        return 1;
+#else
+    // In-situ parsing, decode strings directly in the source string. Source 
must be string.
+    char buffer[sizeof(json)];
+    memcpy(buffer, json, sizeof(json));
+    if (document.ParseInsitu(buffer).HasParseError())
+        return 1;
+#endif
+
+    printf("\nParsing to document succeeded.\n");
+
+    
////////////////////////////////////////////////////////////////////////////
+    // 2. Access values in document. 
+
+    printf("\nAccess values in document:\n");
+    assert(document.IsObject());    // Document is a JSON value represents the 
root of DOM. Root can be either an object or array.
+
+    assert(document.HasMember("hello"));
+    assert(document["hello"].IsString());
+    printf("hello = %s\n", document["hello"].GetString());
+
+    // Since version 0.2, you can use single lookup to check the existing of 
member and its value:
+    Value::MemberIterator hello = document.FindMember("hello");
+    assert(hello != document.MemberEnd());
+    assert(hello->value.IsString());
+    assert(strcmp("world", hello->value.GetString()) == 0);
+    (void)hello;
+
+    assert(document["t"].IsBool());     // JSON true/false are bool. Can also 
uses more specific function IsTrue().
+    printf("t = %s\n", document["t"].GetBool() ? "true" : "false");
+
+    assert(document["f"].IsBool());
+    printf("f = %s\n", document["f"].GetBool() ? "true" : "false");
+
+    printf("n = %s\n", document["n"].IsNull() ? "null" : "?");
+
+    assert(document["i"].IsNumber());   // Number is a JSON type, but C++ 
needs more specific type.
+    assert(document["i"].IsInt());      // In this case, 
IsUint()/IsInt64()/IsUInt64() also return true.
+    printf("i = %d\n", document["i"].GetInt()); // Alternative 
(int)document["i"]
+
+    assert(document["pi"].IsNumber());
+    assert(document["pi"].IsDouble());
+    printf("pi = %g\n", document["pi"].GetDouble());
+
+    {
+        const Value& a = document["a"]; // Using a reference for consecutive 
access is handy and faster.
+        assert(a.IsArray());
+        for (SizeType i = 0; i < a.Size(); i++) // rapidjson uses SizeType 
instead of size_t.
+            printf("a[%d] = %d\n", i, a[i].GetInt());
+        
+        int y = a[0].GetInt();
+        (void)y;
+
+        // Iterating array with iterators
+        printf("a = ");
+        for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr)
+            printf("%d ", itr->GetInt());
+        printf("\n");
+    }
+
+    // Iterating object members
+    static const char* kTypeNames[] = { "Null", "False", "True", "Object", 
"Array", "String", "Number" };
+    for (Value::ConstMemberIterator itr = document.MemberBegin(); itr != 
document.MemberEnd(); ++itr)
+        printf("Type of member %s is %s\n", itr->name.GetString(), 
kTypeNames[itr->value.GetType()]);
+
+    
////////////////////////////////////////////////////////////////////////////
+    // 3. Modify values in document.
+
+    // Change i to a bigger number
+    {
+        uint64_t f20 = 1;   // compute factorial of 20
+        for (uint64_t j = 1; j <= 20; j++)
+            f20 *= j;
+        document["i"] = f20;    // Alternate form: document["i"].SetUint64(f20)
+        assert(!document["i"].IsInt()); // No longer can be cast as int or 
uint.
+    }
+
+    // Adding values to array.
+    {
+        Value& a = document["a"];   // This time we uses non-const reference.
+        Document::AllocatorType& allocator = document.GetAllocator();
+        for (int i = 5; i <= 10; i++)
+            a.PushBack(i, allocator);   // May look a bit strange, allocator 
is needed for potentially realloc. We normally uses the document's.
+
+        // Fluent API
+        a.PushBack("Lua", allocator).PushBack("Mio", allocator);
+    }
+
+    // Making string values.
+
+    // This version of SetString() just store the pointer to the string.
+    // So it is for literal and string that exists within value's life-cycle.
+    {
+        document["hello"] = "rapidjson";    // This will invoke strlen()
+        // Faster version:
+        // document["hello"].SetString("rapidjson", 9);
+    }
+
+    // This version of SetString() needs an allocator, which means it will 
allocate a new buffer and copy the the string into the buffer.
+    Value author;
+    {
+        char buffer2[10];
+        int len = sprintf(buffer2, "%s %s", "Milo", "Yip");  // synthetic 
example of dynamically created string.
+
+        author.SetString(buffer2, static_cast<SizeType>(len), 
document.GetAllocator());
+        // Shorter but slower version:
+        // document["hello"].SetString(buffer, document.GetAllocator());
+
+        // Constructor version: 
+        // Value author(buffer, len, document.GetAllocator());
+        // Value author(buffer, document.GetAllocator());
+        memset(buffer2, 0, sizeof(buffer2)); // For demonstration purpose.
+    }
+    // Variable 'buffer' is unusable now but 'author' has already made a copy.
+    document.AddMember("author", author, document.GetAllocator());
+
+    assert(author.IsNull());        // Move semantic for assignment. After 
this variable is assigned as a member, the variable becomes null.
+
+    
////////////////////////////////////////////////////////////////////////////
+    // 4. Stringify JSON
+
+    printf("\nModified JSON with reformatting:\n");
+    StringBuffer sb;
+    PrettyWriter<StringBuffer> writer(sb);
+    document.Accept(writer);    // Accept() traverses the DOM and generates 
Handler events.
+    puts(sb.GetString());
+
+    return 0;
+}

http://git-wip-us.apache.org/repos/asf/nifi-minifi-cpp/blob/fd280b5c/thirdparty/rapidjson-1.1.0/include/rapidjson/allocators.h
----------------------------------------------------------------------
diff --git a/thirdparty/rapidjson-1.1.0/include/rapidjson/allocators.h 
b/thirdparty/rapidjson-1.1.0/include/rapidjson/allocators.h
new file mode 100644
index 0000000..98affe0
--- /dev/null
+++ b/thirdparty/rapidjson-1.1.0/include/rapidjson/allocators.h
@@ -0,0 +1,271 @@
+// Tencent is pleased to support the open source community by making RapidJSON 
available.
+// 
+// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All 
rights reserved.
+//
+// Licensed under the MIT License (the "License"); you may not use this file 
except
+// in compliance with the License. You may obtain a copy of the License at
+//
+// http://opensource.org/licenses/MIT
+//
+// Unless required by applicable law or agreed to in writing, software 
distributed 
+// under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR 
+// CONDITIONS OF ANY KIND, either express or implied. See the License for the 
+// specific language governing permissions and limitations under the License.
+
+#ifndef RAPIDJSON_ALLOCATORS_H_
+#define RAPIDJSON_ALLOCATORS_H_
+
+#include "rapidjson.h"
+
+RAPIDJSON_NAMESPACE_BEGIN
+
+///////////////////////////////////////////////////////////////////////////////
+// Allocator
+
+/*! \class rapidjson::Allocator
+    \brief Concept for allocating, resizing and freeing memory block.
+    
+    Note that Malloc() and Realloc() are non-static but Free() is static.
+    
+    So if an allocator need to support Free(), it needs to put its pointer in 
+    the header of memory block.
+
+\code
+concept Allocator {
+    static const bool kNeedFree;    //!< Whether this allocator needs to call 
Free().
+
+    // Allocate a memory block.
+    // \param size of the memory block in bytes.
+    // \returns pointer to the memory block.
+    void* Malloc(size_t size);
+
+    // Resize a memory block.
+    // \param originalPtr The pointer to current memory block. Null pointer is 
permitted.
+    // \param originalSize The current size in bytes. (Design issue: since 
some allocator may not book-keep this, explicitly pass to it can save memory.)
+    // \param newSize the new size in bytes.
+    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize);
+
+    // Free a memory block.
+    // \param pointer to the memory block. Null pointer is permitted.
+    static void Free(void *ptr);
+};
+\endcode
+*/
+
+///////////////////////////////////////////////////////////////////////////////
+// CrtAllocator
+
+//! C-runtime library allocator.
+/*! This class is just wrapper for standard C library memory routines.
+    \note implements Allocator concept
+*/
+class CrtAllocator {
+public:
+    static const bool kNeedFree = true;
+    void* Malloc(size_t size) { 
+        if (size) //  behavior of malloc(0) is implementation defined.
+            return std::malloc(size);
+        else
+            return NULL; // standardize to returning NULL.
+    }
+    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) {
+        (void)originalSize;
+        if (newSize == 0) {
+            std::free(originalPtr);
+            return NULL;
+        }
+        return std::realloc(originalPtr, newSize);
+    }
+    static void Free(void *ptr) { std::free(ptr); }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// MemoryPoolAllocator
+
+//! Default memory allocator used by the parser and DOM.
+/*! This allocator allocate memory blocks from pre-allocated memory chunks. 
+
+    It does not free memory blocks. And Realloc() only allocate new memory.
+
+    The memory chunks are allocated by BaseAllocator, which is CrtAllocator by 
default.
+
+    User may also supply a buffer as the first chunk.
+
+    If the user-buffer is full then additional chunks are allocated by 
BaseAllocator.
+
+    The user-buffer is not deallocated by this allocator.
+
+    \tparam BaseAllocator the allocator type for allocating memory chunks. 
Default is CrtAllocator.
+    \note implements Allocator concept
+*/
+template <typename BaseAllocator = CrtAllocator>
+class MemoryPoolAllocator {
+public:
+    static const bool kNeedFree = false;    //!< Tell users that no need to 
call Free() with this allocator. (concept Allocator)
+
+    //! Constructor with chunkSize.
+    /*! \param chunkSize The size of memory chunk. The default is 
kDefaultChunkSize.
+        \param baseAllocator The allocator for allocating memory chunks.
+    */
+    MemoryPoolAllocator(size_t chunkSize = kDefaultChunkCapacity, 
BaseAllocator* baseAllocator = 0) : 
+        chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(0), 
baseAllocator_(baseAllocator), ownBaseAllocator_(0)
+    {
+    }
+
+    //! Constructor with user-supplied buffer.
+    /*! The user buffer will be used firstly. When it is full, memory pool 
allocates new chunk with chunk size.
+
+        The user buffer will not be deallocated when this allocator is 
destructed.
+
+        \param buffer User supplied buffer.
+        \param size Size of the buffer in bytes. It must at least larger than 
sizeof(ChunkHeader).
+        \param chunkSize The size of memory chunk. The default is 
kDefaultChunkSize.
+        \param baseAllocator The allocator for allocating memory chunks.
+    */
+    MemoryPoolAllocator(void *buffer, size_t size, size_t chunkSize = 
kDefaultChunkCapacity, BaseAllocator* baseAllocator = 0) :
+        chunkHead_(0), chunk_capacity_(chunkSize), userBuffer_(buffer), 
baseAllocator_(baseAllocator), ownBaseAllocator_(0)
+    {
+        RAPIDJSON_ASSERT(buffer != 0);
+        RAPIDJSON_ASSERT(size > sizeof(ChunkHeader));
+        chunkHead_ = reinterpret_cast<ChunkHeader*>(buffer);
+        chunkHead_->capacity = size - sizeof(ChunkHeader);
+        chunkHead_->size = 0;
+        chunkHead_->next = 0;
+    }
+
+    //! Destructor.
+    /*! This deallocates all memory chunks, excluding the user-supplied buffer.
+    */
+    ~MemoryPoolAllocator() {
+        Clear();
+        RAPIDJSON_DELETE(ownBaseAllocator_);
+    }
+
+    //! Deallocates all memory chunks, excluding the user-supplied buffer.
+    void Clear() {
+        while (chunkHead_ && chunkHead_ != userBuffer_) {
+            ChunkHeader* next = chunkHead_->next;
+            baseAllocator_->Free(chunkHead_);
+            chunkHead_ = next;
+        }
+        if (chunkHead_ && chunkHead_ == userBuffer_)
+            chunkHead_->size = 0; // Clear user buffer
+    }
+
+    //! Computes the total capacity of allocated memory chunks.
+    /*! \return total capacity in bytes.
+    */
+    size_t Capacity() const {
+        size_t capacity = 0;
+        for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)
+            capacity += c->capacity;
+        return capacity;
+    }
+
+    //! Computes the memory blocks allocated.
+    /*! \return total used bytes.
+    */
+    size_t Size() const {
+        size_t size = 0;
+        for (ChunkHeader* c = chunkHead_; c != 0; c = c->next)
+            size += c->size;
+        return size;
+    }
+
+    //! Allocates a memory block. (concept Allocator)
+    void* Malloc(size_t size) {
+        if (!size)
+            return NULL;
+
+        size = RAPIDJSON_ALIGN(size);
+        if (chunkHead_ == 0 || chunkHead_->size + size > chunkHead_->capacity)
+            if (!AddChunk(chunk_capacity_ > size ? chunk_capacity_ : size))
+                return NULL;
+
+        void *buffer = reinterpret_cast<char *>(chunkHead_) + 
RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size;
+        chunkHead_->size += size;
+        return buffer;
+    }
+
+    //! Resizes a memory block (concept Allocator)
+    void* Realloc(void* originalPtr, size_t originalSize, size_t newSize) {
+        if (originalPtr == 0)
+            return Malloc(newSize);
+
+        if (newSize == 0)
+            return NULL;
+
+        originalSize = RAPIDJSON_ALIGN(originalSize);
+        newSize = RAPIDJSON_ALIGN(newSize);
+
+        // Do not shrink if new size is smaller than original
+        if (originalSize >= newSize)
+            return originalPtr;
+
+        // Simply expand it if it is the last allocation and there is 
sufficient space
+        if (originalPtr == reinterpret_cast<char *>(chunkHead_) + 
RAPIDJSON_ALIGN(sizeof(ChunkHeader)) + chunkHead_->size - originalSize) {
+            size_t increment = static_cast<size_t>(newSize - originalSize);
+            if (chunkHead_->size + increment <= chunkHead_->capacity) {
+                chunkHead_->size += increment;
+                return originalPtr;
+            }
+        }
+
+        // Realloc process: allocate and copy memory, do not free original 
buffer.
+        if (void* newBuffer = Malloc(newSize)) {
+            if (originalSize)
+                std::memcpy(newBuffer, originalPtr, originalSize);
+            return newBuffer;
+        }
+        else
+            return NULL;
+    }
+
+    //! Frees a memory block (concept Allocator)
+    static void Free(void *ptr) { (void)ptr; } // Do nothing
+
+private:
+    //! Copy constructor is not permitted.
+    MemoryPoolAllocator(const MemoryPoolAllocator& rhs) /* = delete */;
+    //! Copy assignment operator is not permitted.
+    MemoryPoolAllocator& operator=(const MemoryPoolAllocator& rhs) /* = delete 
*/;
+
+    //! Creates a new chunk.
+    /*! \param capacity Capacity of the chunk in bytes.
+        \return true if success.
+    */
+    bool AddChunk(size_t capacity) {
+        if (!baseAllocator_)
+            ownBaseAllocator_ = baseAllocator_ = 
RAPIDJSON_NEW(BaseAllocator());
+        if (ChunkHeader* chunk = 
reinterpret_cast<ChunkHeader*>(baseAllocator_->Malloc(RAPIDJSON_ALIGN(sizeof(ChunkHeader))
 + capacity))) {
+            chunk->capacity = capacity;
+            chunk->size = 0;
+            chunk->next = chunkHead_;
+            chunkHead_ =  chunk;
+            return true;
+        }
+        else
+            return false;
+    }
+
+    static const int kDefaultChunkCapacity = 64 * 1024; //!< Default chunk 
capacity.
+
+    //! Chunk header for perpending to each chunk.
+    /*! Chunks are stored as a singly linked list.
+    */
+    struct ChunkHeader {
+        size_t capacity;    //!< Capacity of the chunk in bytes (excluding the 
header itself).
+        size_t size;        //!< Current size of allocated memory in bytes.
+        ChunkHeader *next;  //!< Next chunk in the linked list.
+    };
+
+    ChunkHeader *chunkHead_;    //!< Head of the chunk linked-list. Only the 
head chunk serves allocation.
+    size_t chunk_capacity_;     //!< The minimum capacity of chunk when they 
are allocated.
+    void *userBuffer_;          //!< User supplied buffer.
+    BaseAllocator* baseAllocator_;  //!< base allocator for allocating memory 
chunks.
+    BaseAllocator* ownBaseAllocator_;   //!< base allocator created by this 
object.
+};
+
+RAPIDJSON_NAMESPACE_END
+
+#endif // RAPIDJSON_ENCODINGS_H_

Reply via email to