blob: 0d19a9f4d5ca6f3098508e8830499e2b25265f38 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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.
*/
/**
* c++ friendly interface for wson
* */
//
// Created by furture on 2018/5/15.
//
#ifndef WSON_PARSER_H
#define WSON_PARSER_H
#include "wson.h"
#include <vector>
#include <string>
typedef std::basic_string<uint16_t, std::char_traits<uint16_t>, std::allocator<uint16_t> > u16string;
/** utf16 support which is so fast and cross javascriptcore java and c plus*/
class wson_parser {
public:
wson_parser(const char* data);
wson_parser(const char* data, int length);
~wson_parser();
/**
* has next type
* */
inline bool hasNext(){
return wson_has_next(this->wsonBuffer);
}
/**
* return value type
* */
inline uint8_t nextType(){
if(wsonBuffer->data && wson_has_next(wsonBuffer)){
return wson_next_type(wsonBuffer);
}
return WSON_NULL_TYPE;
}
/**
* return back type, move parse postion--;
* */
inline void backType(){
if(wsonBuffer && wsonBuffer->position > 0){
wsonBuffer->position--;
}
}
/**
* return is map object
* */
inline bool isMap(uint8_t type){
return type == WSON_MAP_TYPE;
}
/**
* return is array object
* */
inline bool isArray(uint8_t type){
return type == WSON_ARRAY_TYPE;
}
/**
* return is string object
* */
inline bool isString(uint8_t type){
return type == WSON_STRING_TYPE
|| type == WSON_UINT8_STRING_TYPE
|| type == WSON_NUMBER_BIG_INT_TYPE
|| type == WSON_NUMBER_BIG_DECIMAL_TYPE;
}
/**
* return is bool object
* */
inline bool isBool(uint8_t type){
return type == WSON_BOOLEAN_TYPE_FALSE || type == WSON_BOOLEAN_TYPE_TRUE;
}
/**
* return is number object
* */
inline bool isNumber(uint8_t type){
return type == WSON_NUMBER_INT_TYPE
|| type == WSON_NUMBER_FLOAT_TYPE
|| type == WSON_NUMBER_LONG_TYPE
|| type == WSON_NUMBER_DOUBLE_TYPE;
}
/**
* return is null object
* */
inline bool isNull(uint8_t type){
return type == WSON_NULL_TYPE;
}
/**
* return map size
* */
inline int nextMapSize(){
return wson_next_uint(wsonBuffer);
}
/**
* return array size
* */
inline int nextArraySize(){
return wson_next_uint(wsonBuffer);
}
/**
* auto convert utf-16 string number to utf-8 string
* */
std::string nextMapKeyUTF8();
/**
* auto convert object or number to string
* */
std::string nextStringUTF8(uint8_t type);
/**
* return number value, if type is string convert to number
* */
double nextNumber(uint8_t type);
/** return bool value */
bool nextBool(uint8_t type);
/**
* skip current value type
* */
void skipValue(uint8_t type);
/**
* reset to start position
* */
inline void resetState(){
if(this->wsonBuffer){
this->wsonBuffer->position = 0;
}
}
/**
* get current state position
* */
inline int getState(){
return this->wsonBuffer->position;
}
/**restore parse to state */
inline int restoreToState(int state){
return this->wsonBuffer->position = state;
}
/** conver wson to json string */
std::string toStringUTF8();
private:
wson_buffer* wsonBuffer;
void toJSONtring(std::string &builder);
/**reuse buffer for decoding */
char *requireDecodingBuffer(int length);
char* decodingBuffer = nullptr;
int decodingBufferSize = 0;
};
#endif //WEEX_PROJECT_WSON_PARSER_H