[Cppunit-cvs] cppunit2/include/json autolink.h,NONE,1.1 config.h,NONE,1.1 forwards.h,NONE,1.1 json.h
Brought to you by:
blep
From: Baptiste L. <bl...@us...> - 2005-11-07 22:43:25
|
Update of /cvsroot/cppunit/cppunit2/include/json In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv30871/include/json Added Files: autolink.h config.h forwards.h json.h reader.h value.h writer.h Log Message: - replaced usage of OpenTest::Properties with Json::Value. Json::Value provides a simpler interface and a standard *simple* serialization format. - jsoncpp has been inlined in CppTL to make deploy easier and remove an external dependency. --- NEW FILE: config.h --- #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 # 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 --- NEW FILE: value.h --- #ifndef CPPTL_JSON_H_INCLUDED # define CPPTL_JSON_H_INCLUDED # include "forwards.h" # include <string> # include <map> # include <vector> # ifdef JSON_USE_CPPTL # include <cpptl/forwards.h> # endif namespace Json { class Value; /** \brief Type of the value held by a Value object. */ enum ValueType { nullValue = 0, ///< 'null' value intValue, ///< signed integer value uintValue, ///< unsigned integer value realValue, ///< double value stringValue, ///< UTF-8 string value booleanValue, ///< bool value arrayValue, ///< array value (ordered list) objectValue ///< object value (collection of name/value pairs). }; enum CommentPlacement { commentBefore = 0, ///< a comment placed on the line before a value commentAfterOnSameLine, ///< a comment just after a value on the same line commentAfter, ///< a comment on the line after a value (only make sense for root value) numberOfCommentPlacement }; # ifdef JSON_USE_CPPTL typedef CppTL::AnyEnumerator<const char *> EnumMemberNames; typedef CppTL::AnyEnumerator<const Value &> EnumValues; # endif /** \brief Represents a <a HREF="http://www.json.org">JSON</a> value. * * This class is a discriminated union wrapper that can represents a: * - signed integer [range: Value::minInt - Value::maxInt] * - unsigned integer (range: 0 - Value::maxUInt) * - double * - UTF-8 string * - boolean * - 'null' * - an ordered list of Value * - collection of name/value pairs (javascript object) * * The type of the held value is represented by a #ValueType and * can be obtained using type(). * * values of an #objectValue or #arrayValue can be accessed using operator[]() methods. * Non const methods will automatically create the a #nullValue element * if it does not exist. * The sequence of an #arrayValue will be automatically resize and initialized * with #nullValue. resize() can be used to enlarge or truncate an #arrayValue. * * The get() methods can be used to obtanis default value in the case the required element * does not exist. * * It is possible to iterate over the list of a #objectValue values using * the getMemberNames() method. */ class JSON_API Value { public: typedef std::vector<std::string> Members; typedef int Int; typedef unsigned int UInt; static const Value null; static const Int minInt; static const Int maxInt; static const UInt maxUInt; Value( ValueType type = nullValue ); Value( Int value ); Value( UInt value ); Value( double value ); Value( const char *value ); Value( const std::string &value ); # ifdef JSON_USE_CPPTL Value( const CppTL::ConstString &value ); # endif Value( bool value ); Value( const Value &other ); ~Value(); Value &operator=( const Value &other ); void swap( Value &other ); ValueType type() const; bool operator <( const Value &other ) const; bool operator <=( const Value &other ) const; bool operator >=( const Value &other ) const; bool operator >( const Value &other ) const; bool operator ==( const Value &other ) const; bool operator !=( const Value &other ) const; int compare( const Value &other ); const char *asCString() const; std::string asString() const; # ifdef JSON_USE_CPPTL CppTL::ConstString asConstString() const; # endif Int asInt() const; UInt asUInt() const; double asDouble() const; bool asBool() const; bool isBool() const; bool isInt() const; bool isUInt() const; bool isIntegral() const; bool isDouble() const; bool isNumeric() const; bool isString() const; bool isArray() const; bool isObject() const; bool isConvertibleTo( ValueType other ) const; /// Number of values in array or object UInt size() const; /// Removes all object members and array elements. void clear(); /// Resize the array to size elements. /// New elements are initialized to null. /// May only be called on nullValue or arrayValue. void resize( UInt size ); /// Access an array element (zero based index ). /// If the array contains less than index element, then null value are inserted /// in the array so that its size is index+1. Value &operator[]( UInt index ); /// Access an array element (zero based index ) const Value &operator[]( UInt index ) const; /// If the array contains at least index+1 elements, returns the element value, /// otherwise returns defaultValue. Value get( UInt index, const Value &defaultValue ) const; /// Returns true if index < size(). bool isValidIndex( UInt index ) const; /// Append value to array at the end. /// Equivalent to jsonvalue[jsonvalue.size()] = value; Value &append( const Value &value ); // Access an object value by name, create a null member if it does not exist. Value &operator[]( const char *key ); // Access an object value by name, returns null if there is no member with that name. const Value &operator[]( const char *key ) const; // Access an object value by name, create a null member if it does not exist. Value &operator[]( const std::string &key ); // Access an object value by name, returns null if there is no member with that name. const Value &operator[]( const std::string &key ) const; # ifdef JSON_USE_CPPTL // Access an object value by name, create a null member if it does not exist. Value &operator[]( const CppTL::ConstString &key ); // Access an object value by name, returns null if there is no member with that name. const Value &operator[]( const CppTL::ConstString &key ) const; # endif /// Returns the member named key if it exist, defaultValue otherwise. Value get( const char *key, const Value &defaultValue ) const; /// Returns the member named key if it exist, defaultValue otherwise. Value get( const std::string &key, const Value &defaultValue ) const; # ifdef JSON_USE_CPPTL /// Returns the member named key if it exist, defaultValue otherwise. Value get( const CppTL::ConstString &key, const Value &defaultValue ) const; # endif /// Returns true if the object has a member named key. bool isMember( const char *key ) const; /// Returns true if the object has a member named key. bool isMember( const std::string &key ) const; # ifdef JSON_USE_CPPTL /// Returns true if the object has a member named key. bool isMember( const CppTL::ConstString &key ) const; # endif // Returns a list of the member names. Members getMemberNames() const; # ifdef JSON_USE_CPPTL EnumMemberNames enumMemberNames() const; EnumValues enumValues() const; # endif void setComment( const char *comment, CommentPlacement placement ); void setComment( const std::string &comment, CommentPlacement placement ); bool hasComment( CommentPlacement placement ) const; std::string getComment( CommentPlacement placement ) const; std::string toStyledString() const; private: struct CommentInfo { CommentInfo(); ~CommentInfo(); void setComment( const char *text ); char *comment_; }; struct CZString { enum DuplicationPolicy { noDuplication = 0, duplicate, duplicateOnCopy }; CZString( int index ); CZString( const char *cstr, DuplicationPolicy allocate ); CZString( const CZString &other ); ~CZString(); CZString &operator =( const CZString &other ); bool operator<( const CZString &other ) const; bool operator==( const CZString &other ) const; int index() const; const char *c_str() const; private: void swap( CZString &other ); const char *cstr_; int index_; }; typedef std::map<CZString, Value> ObjectValues; struct MemberNamesTransform { typedef const char *result_type; const char *operator()( const CZString &name ) const { return name.c_str(); } }; union ValueHolder { Int int_; UInt uint_; double real_; bool bool_; char *string_; ObjectValues *map_; } value_; ValueType type_; CommentInfo *comments_; }; /** \brief Experimental and untested: represents an element of the "path" to access a node. */ class PathArgument { public: friend class Path; PathArgument(); PathArgument( Value::UInt index ); PathArgument( const char *key ); PathArgument( const std::string &key ); private: enum Kind { kindNone = 0, kindIndex, kindKey }; std::string key_; Value::UInt index_; Kind kind_; }; /** \brief Experimental and untested: represents a "path" to access a node. * * Syntax: * - "." => root node * - ".[n]" => elements at index 'n' of root node (an array value) * - ".name" => member named 'name' of root node (an object value) * - ".name1.name2.name3" * - ".[0][1][2].name1[3]" * - ".%" => member name is provided as parameter * - ".[%]" => index is provied as parameter */ class Path { public: Path( const std::string &path, const PathArgument &a1 = PathArgument(), const PathArgument &a2 = PathArgument(), const PathArgument &a3 = PathArgument(), const PathArgument &a4 = PathArgument(), const PathArgument &a5 = PathArgument() ); const Value &resolve( const Value &root ) const; Value resolve( const Value &root, const Value &defaultValue ) const; /// Creates the "path" to access the specified node and returns a reference on the node. Value &make( Value &root ) const; private: typedef std::vector<const PathArgument *> InArgs; typedef std::vector<PathArgument> Args; void makePath( const std::string &path, const InArgs &in ); void addPathInArg( const std::string &path, const InArgs &in, InArgs::const_iterator &itInArg, PathArgument::Kind kind ); void invalidPath( const std::string &path, int location ); Args args_; }; } // namespace Json #endif // CPPTL_JSON_H_INCLUDED --- NEW FILE: json.h --- #ifndef JSON_JSON_H_INCLUDED # define JSON_JSON_H_INCLUDED # include "autolink.h" # include "value.h" # include "reader.h" # include "writer.h" #endif // JSON_JSON_H_INCLUDED --- NEW FILE: forwards.h --- #ifndef JSON_FORWARDS_H_INCLUDED # define JSON_FORWARDS_H_INCLUDED # include "config.h" namespace Json { class FastWriter; class Path; class PathArgument; class Reader; class StyledWriter; class Value; } // namespace Json #endif // JSON_FORWARDS_H_INCLUDED --- NEW FILE: reader.h --- #ifndef CPPTL_JSON_READER_H_INCLUDED # define CPPTL_JSON_READER_H_INCLUDED # include "forwards.h" # include "value.h" # include <deque> # include <map> # include <stack> # include <string> namespace Json { class Value; /** \brief Unserialize a <a HREF="http://www.json.org">JSON</a> document into a Value. * * */ class JSON_API Reader { public: typedef char Char; typedef const Char *Location; Reader(); /** \brief Read a Value from a <a HREF="http://www.json.org">JSON</a> document. * \param document UTF-8 encoded string containing the document to read. * \param root [out] Contains the root value of the document if it was * successfully parsed. * \param collectComments \c true to collect comment and allow writing them back during * serialization, \c false to discard comments. * \return \c true if the document was successfully parsed, \c false if an error occurred. */ bool parse( const std::string &document, Value &root, bool collectComments = true ); /** \brief Returns a user friendly string that list errors in the parsed document. * \return Formatted error message with the list of errors with their location in * the parsed document. An empty string is returned if no error occurred * during parsing. */ std::string getFormatedErrorMessages() const; private: enum TokenType { tokenEndOfStream = 0, tokenObjectBegin, tokenObjectEnd, tokenArrayBegin, tokenArrayEnd, tokenString, tokenNumber, tokenTrue, tokenFalse, tokenNull, tokenArraySeparator, tokenMemberSeparator, tokenComment, tokenError }; class Token { public: TokenType type_; Location start_; Location end_; }; class ErrorInfo { public: Token token_; std::string message_; Location extra_; }; typedef std::deque<ErrorInfo> Errors; bool expectToken( TokenType type, Token &token, const char *message ); bool readToken( Token &token ); void skipSpaces(); bool match( Location pattern, int patternLength ); bool readComment(); bool readCStyleComment(); bool readCppStyleComment(); bool readString(); void readNumber(); bool readValue(); bool readObject( Token &token ); bool readArray( Token &token ); bool decodeNumber( Token &token ); bool decodeString( Token &token ); bool decodeString( Token &token, std::string &decoded ); bool decodeDouble( Token &token ); bool decodeUnicodeEscapeSequence( Token &token, Location ¤t, Location end, unsigned int &unicode ); bool addError( const std::string &message, Token &token, Location extra = 0 ); bool recoverFromError( TokenType skipUntilToken ); bool addErrorAndRecover( const std::string &message, Token &token, TokenType skipUntilToken ); void skipUntilSpace(); Value ¤tValue(); Char getNextChar(); void getLocationLineAndColumn( Location location, int &line, int &column ) const; std::string getLocationLineAndColumn( Location location ) const; void addComment( Location begin, Location end, CommentPlacement placement ); void skipCommentTokens( Token &token ); typedef std::stack<Value *> Nodes; Nodes nodes_; Errors errors_; std::string document_; Location begin_; Location end_; Location current_; Location lastValueEnd_; Value *lastValue_; std::string commentsBefore_; bool collectComments_; }; } // namespace Json #endif // CPPTL_JSON_READER_H_INCLUDED --- NEW FILE: writer.h --- #ifndef JSON_WRITER_H_INCLUDED # define JSON_WRITER_H_INCLUDED # include "value.h" # include <deque> # include <string> namespace Json { class Value; /** \brief Outputs a Value in <a HREF="http://www.json.org">JSON</a> format without formatting (not human friendly). * * The JSON document is written in a single line. It is not intended for 'human' consumption, * but may be usefull to support feature such as RPC where bandwith is limited. * \sa Reader, Value */ class JSON_API FastWriter { public: std::string write( const Value &root ); private: void writeValue( const Value &value ); std::string document_; }; /** \brief Writes a Value in <a HREF="http://www.json.org">JSON</a> format in a human friendly way. * * The rules for line break and indent are as follow: * - Object value: * - if empty then print {} without indent and line break * - if not empty the print '{', line break & indent, print one value per line * and then unindent and line break and print '}'. * - Array value: * - if empty then print [] without indent and line break * - if the array contains no object value, empty array or some other value types, * and all the values fit on one lines, then print the array on a single line. * - otherwise, it the values do not fit on one line, or the array contains * object or non empty array, then print one value per line. * * If the Value have comments then they are outputed according to their #CommentPlacement. * * \sa Reader, Value, Value::setComment() */ class JSON_API StyledWriter { public: StyledWriter(); /** \brief Serialize a Value in <a HREF="http://www.json.org">JSON</a> format. * \param root Value to serialize. * \return String containing the JSON document that represent the root value. */ std::string write( const Value &root ); private: void writeValue( const Value &value ); void writeArrayValue( const Value &value ); bool isMultineArray( const Value &value ); void pushValue( const std::string &value ); void writeIndent(); void writeWithIndent( const std::string &value ); void indent(); void unindent(); void writeCommentBeforeValue( const Value &root ); void writeCommentAfterValueOnSameLine( const Value &root ); bool hasCommentForValue( const Value &value ); static std::string normalizeEOL( const std::string &text ); typedef std::vector<std::string> ChildValues; ChildValues childValues_; std::string document_; std::string indentString_; int rightMargin_; int indentSize_; bool addChildValues_; }; std::string JSON_API valueToString( Value::Int value ); std::string JSON_API valueToString( Value::UInt value ); std::string JSON_API valueToString( double value ); std::string JSON_API valueToString( bool value ); std::string JSON_API valueToQuotedString( const char *value ); } // namespace Json #endif // JSON_WRITER_H_INCLUDED --- NEW FILE: autolink.h --- #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 |