-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 15536d6
Showing
83 changed files
with
58,827 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
#ifndef JSON_AUTOLINK_H_INCLUDED | ||
# define JSON_AUTOLINK_H_INCLUDED | ||
|
||
# include "config.h" | ||
|
||
# ifdef JSON_IN_CPPTL | ||
# include <cpptl/cpptl_autolink.h> | ||
# endif | ||
|
||
# if !defined(JSON_NO_AUTOLINK) && !defined(JSON_DLL_BUILD) && !defined(JSON_IN_CPPTL) | ||
# define CPPTL_AUTOLINK_NAME "json" | ||
# undef CPPTL_AUTOLINK_DLL | ||
# ifdef JSON_DLL | ||
# define CPPTL_AUTOLINK_DLL | ||
# endif | ||
# include "autolink.h" | ||
# endif | ||
|
||
#endif // JSON_AUTOLINK_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
#ifndef JSON_CONFIG_H_INCLUDED | ||
# define JSON_CONFIG_H_INCLUDED | ||
|
||
/// If defined, indicates that json library is embedded in CppTL library. | ||
//# define JSON_IN_CPPTL 1 | ||
|
||
/// If defined, indicates that json may leverage CppTL library | ||
//# define JSON_USE_CPPTL 1 | ||
/// If defined, indicates that cpptl vector based map should be used instead of std::map | ||
/// as Value container. | ||
//# define JSON_USE_CPPTL_SMALLMAP 1 | ||
/// If defined, indicates that Json specific container should be used | ||
/// (hash table & simple deque container with customizable allocator). | ||
/// THIS FEATURE IS STILL EXPERIMENTAL! | ||
//# define JSON_VALUE_USE_INTERNAL_MAP 1 | ||
/// Force usage of standard new/malloc based allocator instead of memory pool based allocator. | ||
/// The memory pools allocator used optimization (initializing Value and ValueInternalLink | ||
/// as if it was a POD) that may cause some validation tool to report errors. | ||
/// Only has effects if JSON_VALUE_USE_INTERNAL_MAP is defined. | ||
//# define JSON_USE_SIMPLE_INTERNAL_ALLOCATOR 1 | ||
|
||
/// If defined, indicates that Json use exception to report invalid type manipulation | ||
/// instead of C assert macro. | ||
# define JSON_USE_EXCEPTION 1 | ||
|
||
# ifdef JSON_IN_CPPTL | ||
# include <cpptl/config.h> | ||
# ifndef JSON_USE_CPPTL | ||
# define JSON_USE_CPPTL 1 | ||
# endif | ||
# endif | ||
|
||
# ifdef JSON_IN_CPPTL | ||
# define JSON_API CPPTL_API | ||
# elif defined(JSON_DLL_BUILD) | ||
# define JSON_API __declspec(dllexport) | ||
# elif defined(JSON_DLL) | ||
# define JSON_API __declspec(dllimport) | ||
# else | ||
# define JSON_API | ||
# endif | ||
|
||
#endif // JSON_CONFIG_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
#ifndef CPPTL_JSON_FEATURES_H_INCLUDED | ||
# define CPPTL_JSON_FEATURES_H_INCLUDED | ||
|
||
# include "forwards.h" | ||
|
||
namespace Json { | ||
|
||
/** \brief Configuration passed to reader and writer. | ||
* This configuration object can be used to force the Reader or Writer | ||
* to behave in a standard conforming way. | ||
*/ | ||
class JSON_API Features | ||
{ | ||
public: | ||
/** \brief A configuration that allows all features and assumes all strings are UTF-8. | ||
* - C & C++ comments are allowed | ||
* - Root object can be any JSON value | ||
* - Assumes Value strings are encoded in UTF-8 | ||
*/ | ||
static Features all(); | ||
|
||
/** \brief A configuration that is strictly compatible with the JSON specification. | ||
* - Comments are forbidden. | ||
* - Root object must be either an array or an object value. | ||
* - Assumes Value strings are encoded in UTF-8 | ||
*/ | ||
static Features strictMode(); | ||
|
||
/** \brief Initialize the configuration like JsonConfig::allFeatures; | ||
*/ | ||
Features(); | ||
|
||
/// \c true if comments are allowed. Default: \c true. | ||
bool allowComments_; | ||
|
||
/// \c true if root must be either an array or an object value. Default: \c false. | ||
bool strictRoot_; | ||
}; | ||
|
||
} // namespace Json | ||
|
||
#endif // CPPTL_JSON_FEATURES_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
#ifndef JSON_FORWARDS_H_INCLUDED | ||
# define JSON_FORWARDS_H_INCLUDED | ||
|
||
# include "config.h" | ||
|
||
namespace Json { | ||
|
||
// writer.h | ||
class FastWriter; | ||
class StyledWriter; | ||
|
||
// reader.h | ||
class Reader; | ||
|
||
// features.h | ||
class Features; | ||
|
||
// value.h | ||
typedef int Int; | ||
typedef unsigned int UInt; | ||
class StaticString; | ||
class Path; | ||
class PathArgument; | ||
class Value; | ||
class ValueIteratorBase; | ||
class ValueIterator; | ||
class ValueConstIterator; | ||
#ifdef JSON_VALUE_USE_INTERNAL_MAP | ||
class ValueAllocator; | ||
class ValueMapAllocator; | ||
class ValueInternalLink; | ||
class ValueInternalArray; | ||
class ValueInternalMap; | ||
#endif // #ifdef JSON_VALUE_USE_INTERNAL_MAP | ||
|
||
} // namespace Json | ||
|
||
|
||
#endif // JSON_FORWARDS_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
#ifndef JSON_JSON_H_INCLUDED | ||
# define JSON_JSON_H_INCLUDED | ||
|
||
# include "autolink.h" | ||
# include "value.h" | ||
# include "reader.h" | ||
# include "writer.h" | ||
# include "features.h" | ||
|
||
#endif // JSON_JSON_H_INCLUDED |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,125 @@ | ||
#ifndef JSONCPP_BATCHALLOCATOR_H_INCLUDED | ||
# define JSONCPP_BATCHALLOCATOR_H_INCLUDED | ||
|
||
# include <stdlib.h> | ||
# include <assert.h> | ||
|
||
# ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION | ||
|
||
namespace Json { | ||
|
||
/* Fast memory allocator. | ||
* | ||
* This memory allocator allocates memory for a batch of object (specified by | ||
* the page size, the number of object in each page). | ||
* | ||
* It does not allow the destruction of a single object. All the allocated objects | ||
* can be destroyed at once. The memory can be either released or reused for future | ||
* allocation. | ||
* | ||
* The in-place new operator must be used to construct the object using the pointer | ||
* returned by allocate. | ||
*/ | ||
template<typename AllocatedType | ||
,const unsigned int objectPerAllocation> | ||
class BatchAllocator | ||
{ | ||
public: | ||
typedef AllocatedType Type; | ||
|
||
BatchAllocator( unsigned int objectsPerPage = 255 ) | ||
: freeHead_( 0 ) | ||
, objectsPerPage_( objectsPerPage ) | ||
{ | ||
// printf( "Size: %d => %s\n", sizeof(AllocatedType), typeid(AllocatedType).name() ); | ||
assert( sizeof(AllocatedType) * objectPerAllocation >= sizeof(AllocatedType *) ); // We must be able to store a slist in the object free space. | ||
assert( objectsPerPage >= 16 ); | ||
batches_ = allocateBatch( 0 ); // allocated a dummy page | ||
currentBatch_ = batches_; | ||
} | ||
|
||
~BatchAllocator() | ||
{ | ||
for ( BatchInfo *batch = batches_; batch; ) | ||
{ | ||
BatchInfo *nextBatch = batch->next_; | ||
free( batch ); | ||
batch = nextBatch; | ||
} | ||
} | ||
|
||
/// allocate space for an array of objectPerAllocation object. | ||
/// @warning it is the responsability of the caller to call objects constructors. | ||
AllocatedType *allocate() | ||
{ | ||
if ( freeHead_ ) // returns node from free list. | ||
{ | ||
AllocatedType *object = freeHead_; | ||
freeHead_ = *(AllocatedType **)object; | ||
return object; | ||
} | ||
if ( currentBatch_->used_ == currentBatch_->end_ ) | ||
{ | ||
currentBatch_ = currentBatch_->next_; | ||
while ( currentBatch_ && currentBatch_->used_ == currentBatch_->end_ ) | ||
currentBatch_ = currentBatch_->next_; | ||
|
||
if ( !currentBatch_ ) // no free batch found, allocate a new one | ||
{ | ||
currentBatch_ = allocateBatch( objectsPerPage_ ); | ||
currentBatch_->next_ = batches_; // insert at the head of the list | ||
batches_ = currentBatch_; | ||
} | ||
} | ||
AllocatedType *allocated = currentBatch_->used_; | ||
currentBatch_->used_ += objectPerAllocation; | ||
return allocated; | ||
} | ||
|
||
/// Release the object. | ||
/// @warning it is the responsability of the caller to actually destruct the object. | ||
void release( AllocatedType *object ) | ||
{ | ||
assert( object != 0 ); | ||
*(AllocatedType **)object = freeHead_; | ||
freeHead_ = object; | ||
} | ||
|
||
private: | ||
struct BatchInfo | ||
{ | ||
BatchInfo *next_; | ||
AllocatedType *used_; | ||
AllocatedType *end_; | ||
AllocatedType buffer_[objectPerAllocation]; | ||
}; | ||
|
||
// disabled copy constructor and assignement operator. | ||
BatchAllocator( const BatchAllocator & ); | ||
void operator =( const BatchAllocator &); | ||
|
||
static BatchInfo *allocateBatch( unsigned int objectsPerPage ) | ||
{ | ||
const unsigned int mallocSize = sizeof(BatchInfo) - sizeof(AllocatedType)* objectPerAllocation | ||
+ sizeof(AllocatedType) * objectPerAllocation * objectsPerPage; | ||
BatchInfo *batch = static_cast<BatchInfo*>( malloc( mallocSize ) ); | ||
batch->next_ = 0; | ||
batch->used_ = batch->buffer_; | ||
batch->end_ = batch->buffer_ + objectsPerPage; | ||
return batch; | ||
} | ||
|
||
BatchInfo *batches_; | ||
BatchInfo *currentBatch_; | ||
/// Head of a single linked list within the allocated space of freeed object | ||
AllocatedType *freeHead_; | ||
unsigned int objectsPerPage_; | ||
}; | ||
|
||
|
||
} // namespace Json | ||
|
||
# endif // ifndef JSONCPP_DOC_INCLUDE_IMPLEMENTATION | ||
|
||
#endif // JSONCPP_BATCHALLOCATOR_H_INCLUDED | ||
|
Oops, something went wrong.