aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorHarsh Sharma <harsh.sharma@multitech.com>2019-12-19 11:53:10 -0600
committerHarsh Sharma <harsh.sharma@multitech.com>2019-12-19 11:53:10 -0600
commit8ce2b9763c880084fd9d38fae6033e487fde58d9 (patch)
tree8b77e3d0c5f24bb8ba4b9ade6298684781a91665 /include
downloadmts-io-sysfs-8ce2b9763c880084fd9d38fae6033e487fde58d9.tar.gz
mts-io-sysfs-8ce2b9763c880084fd9d38fae6033e487fde58d9.tar.bz2
mts-io-sysfs-8ce2b9763c880084fd9d38fae6033e487fde58d9.zip
Initial commit
Diffstat (limited to 'include')
-rw-r--r--include/AccessoryCards/AccessoryCardLora.h16
-rw-r--r--include/AccessoryCards/AccessoryCardLora15.h18
-rw-r--r--include/Device/Device.h66
-rw-r--r--include/General.h82
-rw-r--r--include/Version.h25
-rw-r--r--include/rapidjson/allocators.h290
-rw-r--r--include/rapidjson/cursorstreamwrapper.h78
-rw-r--r--include/rapidjson/document.h2652
-rw-r--r--include/rapidjson/encodedstream.h299
-rw-r--r--include/rapidjson/encodings.h716
-rw-r--r--include/rapidjson/error/en.h74
-rw-r--r--include/rapidjson/error/error.h161
-rw-r--r--include/rapidjson/filereadstream.h99
-rw-r--r--include/rapidjson/filewritestream.h104
-rw-r--r--include/rapidjson/fwd.h151
-rw-r--r--include/rapidjson/internal/biginteger.h290
-rw-r--r--include/rapidjson/internal/diyfp.h271
-rw-r--r--include/rapidjson/internal/dtoa.h245
-rw-r--r--include/rapidjson/internal/ieee754.h78
-rw-r--r--include/rapidjson/internal/itoa.h308
-rw-r--r--include/rapidjson/internal/meta.h186
-rw-r--r--include/rapidjson/internal/pow10.h55
-rw-r--r--include/rapidjson/internal/regex.h740
-rw-r--r--include/rapidjson/internal/stack.h232
-rw-r--r--include/rapidjson/internal/strfunc.h69
-rw-r--r--include/rapidjson/internal/strtod.h290
-rw-r--r--include/rapidjson/internal/swap.h46
-rw-r--r--include/rapidjson/istreamwrapper.h128
-rw-r--r--include/rapidjson/memorybuffer.h70
-rw-r--r--include/rapidjson/memorystream.h71
-rw-r--r--include/rapidjson/msinttypes/inttypes.h316
-rw-r--r--include/rapidjson/msinttypes/stdint.h300
-rw-r--r--include/rapidjson/ostreamwrapper.h81
-rw-r--r--include/rapidjson/pointer.h1414
-rw-r--r--include/rapidjson/prettywriter.h277
-rw-r--r--include/rapidjson/rapidjson.h656
-rw-r--r--include/rapidjson/reader.h2230
-rw-r--r--include/rapidjson/schema.h2497
-rw-r--r--include/rapidjson/stream.h223
-rw-r--r--include/rapidjson/stringbuffer.h121
-rw-r--r--include/rapidjson/writer.h709
41 files changed, 16734 insertions, 0 deletions
diff --git a/include/AccessoryCards/AccessoryCardLora.h b/include/AccessoryCards/AccessoryCardLora.h
new file mode 100644
index 0000000..28f62ff
--- /dev/null
+++ b/include/AccessoryCards/AccessoryCardLora.h
@@ -0,0 +1,16 @@
+#ifndef ACCESSORYCARDLORA_H_
+#define ACCESSORYCARDLORA_H_
+
+#include "General.h"
+
+class AccessoryCardLora {
+ private:
+ std::string spiPath;
+ std::string productId;
+ std::string port;
+ public:
+ AccessoryCardLora(std::string ProductId, std::string Port);
+ std::string getPath();
+};
+
+#endif /* ACCESSORYCARDLORA_H_ */
diff --git a/include/AccessoryCards/AccessoryCardLora15.h b/include/AccessoryCards/AccessoryCardLora15.h
new file mode 100644
index 0000000..b1a9d64
--- /dev/null
+++ b/include/AccessoryCards/AccessoryCardLora15.h
@@ -0,0 +1,18 @@
+#ifndef ACCESSORYCARDLORA15_H_
+#define ACCESSORYCARDLORA15_H_
+
+#include "General.h"
+#include "AccessoryCardLora.h"
+
+class AccessoryCardLora15 : private AccessoryCardLora {
+ private:
+ void *spi_target_ptr = NULL;
+ public:
+ AccessoryCardLora15(std::string ProductId, std::string Port);
+ int spiOpen(const char *spidev);
+ int spiRead(uint8_t address, uint8_t *data);
+ int spiClose();
+ uint8_t getFPGAVersion();
+};
+
+#endif /* ACCESSORYCARDLORA15_H_ */
diff --git a/include/Device/Device.h b/include/Device/Device.h
new file mode 100644
index 0000000..1c6f77e
--- /dev/null
+++ b/include/Device/Device.h
@@ -0,0 +1,66 @@
+#ifndef DEVICE_H_
+#define DEVICE_H_
+
+#include "General.h"
+#include "Version.h"
+#include "AccessoryCardLora15.h"
+
+class Device {
+ private:
+ bool verbose = false;
+ bool isRoot;
+ rapidjson::Document capabilities;
+ rapidjson::Document deviceInfo;
+ rapidjson::Document accessoryCards;
+ rapidjson::Value accessoryCard;
+ rapidjson::Document::AllocatorType& alloc = deviceInfo.GetAllocator();
+ rapidjson::Document::AllocatorType& accessoryCardsAlloc = accessoryCards.GetAllocator();
+ static const std::vector<std::string> apIdentifiers;
+
+ std::map<std::string, bool> capabilityList = {{"adc", false},{"battery", false},{"bluetooth", false},
+ {"cell", false},{"cellWwan", false},{"din", false},{"dout", false},{"externalSerialPort", false},
+ {"gpio", false},{"gps", false},{"lora", false},{"loraNetworkServer", false},
+ {"nodeRed", false},{"rs232", false},{"rs422", false},{"rs485", false},{"serial", false},
+ {"wifi", false}};
+ std::map<std::string, std::string> deviceInfoList = {{"deviceId", ""},{"hardwareVersion", ""},
+ {"imei", ""},{"macAddress", "00:00:00:00:00:00"},{"macBluetooth", "00:00:00:00:00:00"},
+ {"macWifi", "00:00:00:00:00:00"},{"productId", ""},{"uuid", ""},{"vendorId", ""}};
+
+ static const std::regex apFilters;
+ static const std::regex lora15Filters;
+ static const std::regex loraG16Filters;
+ static const std::regex loraG64Filters;
+ static const std::regex gpiobFilters;
+ static const std::regex mfserFilters;
+ static const std::regex serialModeFilter;
+ static const std::regex storeFilters;
+ static const std::regex showFilters;
+
+ public:
+ Device();
+ void exitHandler(int code);
+ bool fileExists(std::string file);
+ mode_t fileType(std::string file);
+ void getSystemTreeJson(const char * dir_name);
+ void init();
+ void load();
+ void logInfo(std::string info);
+ void logError(std::string info);
+ void json();
+ void mapFileToCapability();
+ void mapFirmware();
+ void printDir(const std::string dir_name, std::vector<std::string> &results);
+ void printJson();
+ void printVersion (std::string name);
+ void printUsage(std::string program);
+ void show(std::string program);
+ void showTrigger(std::string name);
+ void store(std::string name, std::string value);
+ void storeTrigger(std::string name, std::string value);
+ std::string toCamelCase(const char * d_name);
+ void Verbose(bool val);
+ bool Verbose();
+ void writeJson();
+};
+
+#endif /* DEVICE_H_ */
diff --git a/include/General.h b/include/General.h
new file mode 100644
index 0000000..3e89c20
--- /dev/null
+++ b/include/General.h
@@ -0,0 +1,82 @@
+#ifndef GENERAL_HPP
+#define GENERAL_HPP
+
+#ifdef _MSC_VER
+#pragma warning ( disable : 4514 4512 4710 4355)
+#endif
+
+typedef signed char sint8;
+typedef unsigned char uint8;
+typedef signed short sint16;
+typedef unsigned short uint16;
+typedef signed int sint32;
+typedef unsigned int uint32;
+typedef signed long long sint64;
+typedef unsigned long long uint64;
+typedef signed int sint; //32 bit - even on 64 bit machines
+typedef unsigned int uint; //32 bit - even on 64 bit machines
+
+#define memzero(ptr) memset(ptr,0,sizeof(*(ptr)))
+#define ArrayZero(ptr,elements) memset(ptr,0,sizeof(*(ptr)) * (elements))
+
+#include <mts/MTS_System.h>
+#include <mts/MTS_Text.h>
+
+#include <fstream>
+#include <iostream>
+#include <stdlib.h>
+#include <stdio.h> /* printf fprintf */
+#include <fcntl.h> /* open */
+#include <linux/spi/spidev.h>
+#include <sys/ioctl.h>
+#include <unistd.h> /* lseek, close */
+#include <dirent.h>
+#include <regex>
+#include <sys/stat.h>
+
+
+#include "rapidjson/document.h"
+#include "rapidjson/writer.h"
+#include "rapidjson/stringbuffer.h"
+#include "rapidjson/istreamwrapper.h"
+
+#define MAX_ACC_CARDS 4
+
+#define VERBOSE false
+#define MTS_IO_CONTROLS_STATUS_LED false
+#define MTS_IO_CONTROLS_LS_LED false
+
+#define FIRMWARE_VERSION "Version"
+#define FIRMWARE_DATE "Date"
+
+#define SYSFS_PLATFORM "/sys/devices/platform/mts-io/"
+#define LEDS_GPIO_DIR "/sys/devices/platform/leds-gpio/leds/"
+#define FIRMWARE_FILE "/etc/issue"
+
+#define LORA_1_5_AP1_FPGA_VERSION "mts-fpga-loader -p 1 -c | grep version | awk '{printf $4}'"
+#define LORA_1_5_AP2_FPGA_VERSION "mts-fpga-loader -p 2 -c | grep version | awk '{printf $4}'"
+#define LORA_2_1_FPGA_VERSION "mts-fpga-loader -g | grep version | awk '{printf $4}'"
+#define LORA_2_1_EXT_FPGA_VERSION "mts-fpga-loader -b 1 -g | grep version | awk '{printf $4}'"
+
+
+#define MTAC_SX1301 0x0
+#define MTAC_FPGA 0x1
+
+#define MTAC_FPGA_ADDRESS 0x1
+
+#define READ_ACCESS 0x00
+#define SPI_SPEED 8000000
+
+
+#define RESET_SHORT_CMD "reset_short_handler"
+#define RESET_LONG_CMD "reset_long_handler"
+#define KILL_SIGNAL "kill -l "
+
+
+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+
+
+#endif
+
+
+
diff --git a/include/Version.h b/include/Version.h
new file mode 100644
index 0000000..04166af
--- /dev/null
+++ b/include/Version.h
@@ -0,0 +1,25 @@
+/*
+ * Version.h
+ *
+ * Created on: 2012-04-17
+ * Author: smg
+ */
+
+#ifndef VERSION_H_
+#define VERSION_H_
+
+#include <string>
+
+class Version {
+ public:
+
+ //Pre-build Step - Executed in Makefile -> May require calling "make pre-build"
+ /*
+ * echo -e "//Pre-Build Auto-Generated Source\n
+ * #include \"Version.h\"\n\nconst std::string Version::version(\"$(shell git describe)\");"
+ * > ../Version.cpp
+ */
+ static const std::string version;
+};
+
+#endif /* VERSION_H_ */
diff --git a/include/rapidjson/allocators.h b/include/rapidjson/allocators.h
new file mode 100644
index 0000000..d906bf5
--- /dev/null
+++ b/include/rapidjson/allocators.h
@@ -0,0 +1,290 @@
+// 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
+*/
+
+
+/*! \def RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY
+ \ingroup RAPIDJSON_CONFIG
+ \brief User-defined kDefaultChunkCapacity definition.
+
+ User can define this as any \c size that is a power of 2.
+*/
+
+#ifndef RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY
+#define RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY (64 * 1024)
+#endif
+
+
+///////////////////////////////////////////////////////////////////////////////
+// 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;
+
+ if (chunkHead_ == 0)
+ 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;
+
+ if (chunkHead_ == 0)
+ return NULL;
+
+ // 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 = RAPIDJSON_ALLOCATOR_DEFAULT_CHUNK_CAPACITY; //!< 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_
diff --git a/include/rapidjson/cursorstreamwrapper.h b/include/rapidjson/cursorstreamwrapper.h
new file mode 100644
index 0000000..52c11a7
--- /dev/null
+++ b/include/rapidjson/cursorstreamwrapper.h
@@ -0,0 +1,78 @@
+// 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_CURSORSTREAMWRAPPER_H_
+#define RAPIDJSON_CURSORSTREAMWRAPPER_H_
+
+#include "stream.h"
+
+#if defined(__GNUC__)
+RAPIDJSON_DIAG_PUSH
+RAPIDJSON_DIAG_OFF(effc++)
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER <= 1800
+RAPIDJSON_DIAG_PUSH
+RAPIDJSON_DIAG_OFF(4702) // unreachable code
+RAPIDJSON_DIAG_OFF(4512) // assignment operator could not be generated
+#endif
+
+RAPIDJSON_NAMESPACE_BEGIN
+
+
+//! Cursor stream wrapper for counting line and column number if error exists.
+/*!
+ \tparam InputStream Any stream that implements Stream Concept
+*/
+template <typename InputStream, typename Encoding = UTF8<> >
+class CursorStreamWrapper : public GenericStreamWrapper<InputStream, Encoding> {
+public:
+ typedef typename Encoding::Ch Ch;
+
+ CursorStreamWrapper(InputStream& is):
+ GenericStreamWrapper<InputStream, Encoding>(is), line_(1), col_(0) {}
+
+ // counting line and column number
+ Ch Take() {
+ Ch ch = this->is_.Take();
+ if(ch == '\n') {
+ line_ ++;
+ col_ = 0;
+ } else {
+ col_ ++;
+ }
+ return ch;
+ }
+
+ //! Get the error line number, if error exists.
+ size_t GetLine() const { return line_; }
+ //! Get the error column number, if error exists.
+ size_t GetColumn() const { return col_; }
+
+private:
+ size_t line_; //!< Current Line
+ size_t col_; //!< Current Column
+};
+
+#if defined(_MSC_VER) && _MSC_VER <= 1800
+RAPIDJSON_DIAG_POP
+#endif
+
+#if defined(__GNUC__)
+RAPIDJSON_DIAG_POP
+#endif
+
+RAPIDJSON_NAMESPACE_END
+
+#endif // RAPIDJSON_CURSORSTREAMWRAPPER_H_
diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h
new file mode 100644
index 0000000..9783fe4
--- /dev/null
+++ b/include/rapidjson/document.h
@@ -0,0 +1,2652 @@
+// 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_DOCUMENT_H_
+#define RAPIDJSON_DOCUMENT_H_
+
+/*! \file document.h */
+
+#include "reader.h"
+#include "internal/meta.h"
+#include "internal/strfunc.h"
+#include "memorystream.h"
+#include "encodedstream.h"
+#include <new> // placement new
+#include <limits>
+
+RAPIDJSON_DIAG_PUSH
+#ifdef __clang__
+RAPIDJSON_DIAG_OFF(padded)
+RAPIDJSON_DIAG_OFF(switch-enum)
+RAPIDJSON_DIAG_OFF(c++98-compat)
+#elif defined(_MSC_VER)
+RAPIDJSON_DIAG_OFF(4127) // conditional expression is constant
+RAPIDJSON_DIAG_OFF(4244) // conversion from kXxxFlags to 'uint16_t', possible loss of data
+#endif
+
+#ifdef __GNUC__
+RAPIDJSON_DIAG_OFF(effc++)
+#endif // __GNUC__
+
+#ifndef RAPIDJSON_NOMEMBERITERATORCLASS
+#include <iterator> // std::random_access_iterator_tag
+#endif
+
+#if RAPIDJSON_HAS_CXX11_RVALUE_REFS
+#include <utility> // std::move
+#endif
+
+RAPIDJSON_NAMESPACE_BEGIN
+
+// Forward declaration.
+template <typename Encoding, typename Allocator>
+class GenericValue;
+
+template <typename Encoding, typename Allocator, typename StackAllocator>
+class GenericDocument;
+
+//! Name-value pair in a JSON object value.
+/*!
+ This class was internal to GenericValue. It used to be a inner struct.
+ But a compiler (IBM XL C/C++ for AIX) have reported to have problem with that so it moved as a namespace scope struct.
+ https://code.google.com/p/rapidjson/issues/detail?id=64
+*/
+template <typename Encoding, typename Allocator>
+struct GenericMember {
+ GenericValue<Encoding, Allocator> name; //!< name of member (must be a string)
+ GenericValue<Encoding, Allocator> value; //!< value of member.
+
+ // swap() for std::sort() and other potential use in STL.
+ friend inline void swap(GenericMember& a, GenericMember& b) RAPIDJSON_NOEXCEPT {
+ a.name.Swap(b.name);
+ a.value.Swap(b.value);
+ }
+};
+
+///////////////////////////////////////////////////////////////////////////////
+// GenericMemberIterator
+
+#ifndef RAPIDJSON_NOMEMBERITERATORCLASS
+
+//! (Constant) member iterator for a JSON object value
+/*!
+ \tparam Const Is this a constant iterator?
+ \tparam Encoding Encoding of the value. (Even non-string values need to have the same encoding in a document)
+ \tparam Allocator Allocator type for allocating memory of object, array and string.
+
+ This class implements a Random Access Iterator for GenericMember elements
+ of a GenericValue, see ISO/IEC 14882:2003(E) C++ standard, 24.1 [lib.iterator.requirements].
+
+ \note This iterator implementation is mainly intended to avoid implicit
+ conversions from iterator values to \c NULL,
+ e.g. from GenericValue::FindMember.
+
+ \note Define \c RAPIDJSON_NOMEMBERIT