Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
R
rapidjson
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
rapidjson
Commits
5c93e64c
Commit
5c93e64c
authored
May 01, 2015
by
miloyip
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix clang compilation
parent
c1bcccb1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
108 additions
and
77 deletions
+108
-77
schema.h
include/rapidjson/schema.h
+108
-77
No files found.
include/rapidjson/schema.h
View file @
5c93e64c
...
...
@@ -38,7 +38,7 @@ struct SchemaValidationContext {
template
<
typename
Encoding
>
class
BaseSchema
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
//!< Character type derived from Encoding.
typedef
typename
Encoding
::
Ch
Ch
;
typedef
SchemaValidationContext
<
Encoding
>
Context
;
BaseSchema
()
{}
...
...
@@ -46,7 +46,7 @@ public:
template
<
typename
ValueType
>
BaseSchema
(
const
ValueType
&
value
)
{
ValueType
::
ConstMemberIterator
enumItr
=
value
.
FindMember
(
"enum"
);
typename
ValueType
::
ConstMemberIterator
enumItr
=
value
.
FindMember
(
"enum"
);
if
(
enumItr
!=
value
.
MemberEnd
())
{
if
(
enumItr
->
value
.
IsArray
()
&&
enumItr
->
value
.
Size
()
>
0
)
enum_
.
CopyFrom
(
enumItr
->
value
,
allocator_
);
...
...
@@ -58,16 +58,16 @@ public:
virtual
~
BaseSchema
()
{}
virtual
void
BeginValue
(
Context
&
context
)
const
{}
virtual
void
BeginValue
(
Context
&
)
const
{}
virtual
bool
Null
()
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
())
:
true
;
}
virtual
bool
Bool
(
bool
b
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
b
))
:
true
;
}
virtual
bool
Int
(
int
i
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
i
))
:
true
;
}
virtual
bool
Uint
(
unsigned
u
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
u
))
:
true
;
}
virtual
bool
Int64
(
int64_t
i
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
i
))
:
true
;
}
virtual
bool
Uint64
(
uint64_t
u
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
u
))
:
true
;
}
virtual
bool
Double
(
double
d
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
d
))
:
true
;
}
virtual
bool
String
(
const
Ch
*
s
,
SizeType
length
,
bool
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
s
,
length
))
:
true
;
}
virtual
bool
Null
()
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
()
.
Move
()
)
:
true
;
}
virtual
bool
Bool
(
bool
b
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
b
)
.
Move
()
)
:
true
;
}
virtual
bool
Int
(
int
i
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
i
)
.
Move
()
)
:
true
;
}
virtual
bool
Uint
(
unsigned
u
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
u
)
.
Move
()
)
:
true
;
}
virtual
bool
Int64
(
int64_t
i
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
i
)
.
Move
()
)
:
true
;
}
virtual
bool
Uint64
(
uint64_t
u
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
u
)
.
Move
()
)
:
true
;
}
virtual
bool
Double
(
double
d
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
d
)
.
Move
()
)
:
true
;
}
virtual
bool
String
(
const
Ch
*
s
,
SizeType
length
,
bool
)
const
{
return
enum_
.
IsArray
()
?
CheckEnum
(
GenericValue
<
Encoding
>
(
s
,
length
)
.
Move
()
)
:
true
;
}
virtual
bool
StartObject
(
Context
&
)
const
{
return
true
;
}
virtual
bool
Key
(
Context
&
,
const
Ch
*
,
SizeType
,
bool
)
const
{
return
true
;
}
virtual
bool
EndObject
(
Context
&
,
SizeType
)
const
{
return
true
;
}
...
...
@@ -76,7 +76,7 @@ public:
protected
:
bool
CheckEnum
(
const
GenericValue
<
Encoding
>&
v
)
const
{
for
(
GenericValue
<
Encoding
>::
ConstValueIterator
itr
=
enum_
.
Begin
();
itr
!=
enum_
.
End
();
++
itr
)
for
(
typename
GenericValue
<
Encoding
>::
ConstValueIterator
itr
=
enum_
.
Begin
();
itr
!=
enum_
.
End
();
++
itr
)
if
(
v
==
*
itr
)
return
true
;
return
false
;
...
...
@@ -87,30 +87,17 @@ protected:
};
template
<
typename
Encoding
,
typename
ValueType
>
inline
BaseSchema
<
Encoding
>*
CreateSchema
(
const
ValueType
&
value
)
{
if
(
!
value
.
IsObject
())
return
0
;
ValueType
::
ConstMemberIterator
typeItr
=
value
.
FindMember
(
"type"
);
if
(
typeItr
==
value
.
MemberEnd
())
return
new
TypelessSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"null"
))
return
new
NullSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"boolean"
))
return
new
BooleanSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"object"
))
return
new
ObjectSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"array"
))
return
new
ArraySchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"string"
))
return
new
StringSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"integer"
))
return
new
IntegerSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"number"
))
return
new
NumberSchema
<
Encoding
>
(
value
);
else
return
0
;
}
inline
BaseSchema
<
Encoding
>*
CreateSchema
(
const
ValueType
&
value
);
template
<
typename
Encoding
>
class
TypelessSchema
:
public
BaseSchema
<
Encoding
>
{
public
:
typedef
SchemaValidationContext
<
Encoding
>
Context
;
TypelessSchema
()
{}
template
<
typename
ValueType
>
TypelessSchema
(
const
ValueType
&
value
)
:
BaseSchema
(
value
)
{}
TypelessSchema
(
const
ValueType
&
value
)
:
BaseSchema
<
Encoding
>
(
value
)
{}
virtual
void
BeginValue
(
Context
&
context
)
const
{
context
.
valueSchema
=
this
;
}
};
...
...
@@ -118,10 +105,13 @@ public:
template
<
typename
Encoding
>
class
NullSchema
:
public
BaseSchema
<
Encoding
>
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
typedef
SchemaValidationContext
<
Encoding
>
Context
;
template
<
typename
ValueType
>
NullSchema
(
const
ValueType
&
value
)
:
BaseSchema
<
Encoding
>
(
value
)
{}
virtual
bool
Null
()
const
{
return
BaseSchema
::
Null
();
}
virtual
bool
Null
()
const
{
return
BaseSchema
<
Encoding
>
::
Null
();
}
virtual
bool
Bool
(
bool
)
const
{
return
false
;
}
virtual
bool
Int
(
int
)
const
{
return
false
;
}
virtual
bool
Uint
(
unsigned
)
const
{
return
false
;
}
...
...
@@ -139,22 +129,33 @@ public:
template
<
typename
Encoding
>
class
BooleanSchema
:
public
BaseSchema
<
Encoding
>
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
typedef
SchemaValidationContext
<
Encoding
>
Context
;
template
<
typename
ValueType
>
BooleanSchema
(
const
ValueType
&
value
)
:
BaseSchema
<
Encoding
>
(
value
)
{}
virtual
bool
Null
()
const
{
return
false
;
}
virtual
bool
Bool
(
bool
b
)
const
{
return
BaseSchema
::
Bool
(
b
);
}
virtual
bool
Bool
(
bool
b
)
const
{
return
BaseSchema
<
Encoding
>
::
Bool
(
b
);
}
virtual
bool
Int
(
int
)
const
{
return
false
;
}
virtual
bool
Uint
(
unsigned
)
const
{
return
false
;
}
virtual
bool
Int64
(
int64_t
)
const
{
return
false
;
}
virtual
bool
Uint64
(
uint64_t
)
const
{
return
false
;
}
virtual
bool
Double
(
double
)
const
{
return
false
;
}
virtual
bool
String
(
const
Ch
*
,
SizeType
,
bool
)
const
{
return
false
;
}
virtual
bool
StartObject
(
Context
&
)
const
{
return
false
;
}
virtual
bool
Key
(
Context
&
,
const
Ch
*
,
SizeType
,
bool
)
const
{
return
false
;
}
virtual
bool
EndObject
(
Context
&
,
SizeType
)
const
{
return
false
;
}
virtual
bool
StartArray
(
Context
&
)
const
{
return
false
;
}
virtual
bool
EndArray
(
Context
&
,
SizeType
)
const
{
return
false
;
}
};
template
<
typename
Encoding
>
class
ObjectSchema
:
public
BaseSchema
<
Encoding
>
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
typedef
SchemaValidationContext
<
Encoding
>
Context
;
template
<
typename
ValueType
>
ObjectSchema
(
const
ValueType
&
value
)
:
BaseSchema
<
Encoding
>
(
value
),
...
...
@@ -166,24 +167,24 @@ public:
maxProperties_
(
SizeType
(
~
0
)),
additionalProperty_
(
true
)
{
ValueType
::
ConstMemberIterator
propretiesItr
=
value
.
FindMember
(
Value
(
"properties"
));
typename
ValueType
::
ConstMemberIterator
propretiesItr
=
value
.
FindMember
(
Value
(
"properties"
).
Move
(
));
if
(
propretiesItr
!=
value
.
MemberEnd
())
{
const
ValueType
&
properties
=
propretiesItr
->
value
;
properties_
=
new
Property
[
properties
.
MemberCount
()];
propertyCount_
=
0
;
for
(
ValueType
::
ConstMemberIterator
propertyItr
=
properties
.
MemberBegin
();
propertyItr
!=
properties
.
MemberEnd
();
++
propertyItr
)
{
properties_
[
propertyCount_
].
name
.
SetString
(
propertyItr
->
name
.
GetString
(),
propertyItr
->
name
.
GetStringLength
(),
allocator_
);
for
(
typename
ValueType
::
ConstMemberIterator
propertyItr
=
properties
.
MemberBegin
();
propertyItr
!=
properties
.
MemberEnd
();
++
propertyItr
)
{
properties_
[
propertyCount_
].
name
.
SetString
(
propertyItr
->
name
.
GetString
(),
propertyItr
->
name
.
GetStringLength
(),
BaseSchema
<
Encoding
>::
allocator_
);
properties_
[
propertyCount_
].
schema
=
CreateSchema
<
Encoding
>
(
propertyItr
->
value
);
// TODO: Check error
propertyCount_
++
;
}
}
// Establish required after properties
ValueType
::
ConstMemberIterator
requiredItr
=
value
.
FindMember
(
Value
(
"required"
));
typename
ValueType
::
ConstMemberIterator
requiredItr
=
value
.
FindMember
(
Value
(
"required"
).
Move
(
));
if
(
requiredItr
!=
value
.
MemberEnd
())
{
if
(
requiredItr
->
value
.
IsArray
())
{
for
(
ValueType
::
ConstValueIterator
itr
=
requiredItr
->
value
.
Begin
();
itr
!=
requiredItr
->
value
.
End
();
++
itr
)
{
for
(
typename
ValueType
::
ConstValueIterator
itr
=
requiredItr
->
value
.
Begin
();
itr
!=
requiredItr
->
value
.
End
();
++
itr
)
{
if
(
itr
->
IsString
())
{
SizeType
index
;
if
(
FindPropertyIndex
(
*
itr
,
&
index
))
{
...
...
@@ -199,7 +200,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
additionalPropretiesItr
=
value
.
FindMember
(
Value
(
"additionalProperties"
));
typename
ValueType
::
ConstMemberIterator
additionalPropretiesItr
=
value
.
FindMember
(
Value
(
"additionalProperties"
).
Move
(
));
if
(
additionalPropretiesItr
!=
value
.
MemberEnd
())
{
if
(
additionalPropretiesItr
->
value
.
IsBool
())
additionalProperty_
=
additionalPropretiesItr
->
value
.
GetBool
();
...
...
@@ -210,7 +211,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
minPropertiesItr
=
value
.
FindMember
(
Value
(
"minProperties"
));
typename
ValueType
::
ConstMemberIterator
minPropertiesItr
=
value
.
FindMember
(
Value
(
"minProperties"
).
Move
(
));
if
(
minPropertiesItr
!=
value
.
MemberEnd
())
{
if
(
minPropertiesItr
->
value
.
IsUint64
()
&&
minPropertiesItr
->
value
.
GetUint64
()
<=
SizeType
(
~
0
))
minProperties_
=
static_cast
<
SizeType
>
(
minPropertiesItr
->
value
.
GetUint64
());
...
...
@@ -219,7 +220,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
maxPropertiesItr
=
value
.
FindMember
(
Value
(
"maxProperties"
));
typename
ValueType
::
ConstMemberIterator
maxPropertiesItr
=
value
.
FindMember
(
Value
(
"maxProperties"
).
Move
(
));
if
(
maxPropertiesItr
!=
value
.
MemberEnd
())
{
if
(
maxPropertiesItr
->
value
.
IsUint64
()
&&
maxPropertiesItr
->
value
.
GetUint64
()
<=
SizeType
(
~
0
))
maxProperties_
=
static_cast
<
SizeType
>
(
maxPropertiesItr
->
value
.
GetUint64
());
...
...
@@ -248,7 +249,7 @@ public:
return
true
;
}
virtual
bool
Key
(
Context
&
context
,
const
Ch
*
str
,
SizeType
len
,
bool
copy
)
const
{
virtual
bool
Key
(
Context
&
context
,
const
Ch
*
str
,
SizeType
len
,
bool
)
const
{
SizeType
index
;
if
(
FindPropertyIndex
(
str
,
len
,
&
index
))
{
context
.
valueSchema
=
properties_
[
index
].
schema
;
...
...
@@ -313,13 +314,13 @@ private:
}
GenericValue
<
Encoding
>
name
;
BaseSchema
*
schema
;
BaseSchema
<
Encoding
>
*
schema
;
bool
required
;
};
TypelessSchema
<
Encoding
>
typeless_
;
Property
*
properties_
;
BaseSchema
*
additionalPropertySchema_
;
BaseSchema
<
Encoding
>
*
additionalPropertySchema_
;
SizeType
propertyCount_
;
SizeType
requiredCount_
;
SizeType
minProperties_
;
...
...
@@ -330,6 +331,9 @@ private:
template
<
typename
Encoding
>
class
ArraySchema
:
public
BaseSchema
<
Encoding
>
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
typedef
SchemaValidationContext
<
Encoding
>
Context
;
template
<
typename
ValueType
>
ArraySchema
(
const
ValueType
&
value
)
:
BaseSchema
<
Encoding
>
(
value
),
...
...
@@ -339,14 +343,14 @@ public:
minItems_
(),
maxItems_
(
SizeType
(
~
0
))
{
ValueType
::
ConstMemberIterator
itemsItr
=
value
.
FindMember
(
Value
(
"items"
));
typename
ValueType
::
ConstMemberIterator
itemsItr
=
value
.
FindMember
(
Value
(
"items"
).
Move
(
));
if
(
itemsItr
!=
value
.
MemberEnd
())
{
if
(
itemsItr
->
value
.
IsObject
())
itemsList_
=
CreateSchema
<
Encoding
>
(
itemsItr
->
value
);
// List validation
else
if
(
itemsItr
->
value
.
IsArray
())
{
// Tuple validation
itemsTuple_
=
new
BaseSchema
*
[
itemsItr
->
value
.
Size
()];
for
(
ValueType
::
ConstValueIterator
itr
=
itemsItr
->
value
.
Begin
();
itr
!=
itemsItr
->
value
.
End
();
++
itr
)
{
itemsTuple_
=
new
BaseSchema
<
Encoding
>
*
[
itemsItr
->
value
.
Size
()];
for
(
typename
ValueType
::
ConstValueIterator
itr
=
itemsItr
->
value
.
Begin
();
itr
!=
itemsItr
->
value
.
End
();
++
itr
)
{
itemsTuple_
[
itemsTupleCount_
]
=
CreateSchema
<
Encoding
>
(
*
itr
);
itemsTupleCount_
++
;
}
...
...
@@ -356,7 +360,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
minItemsItr
=
value
.
FindMember
(
Value
(
"minItems"
));
typename
ValueType
::
ConstMemberIterator
minItemsItr
=
value
.
FindMember
(
Value
(
"minItems"
).
Move
(
));
if
(
minItemsItr
!=
value
.
MemberEnd
())
{
if
(
minItemsItr
->
value
.
IsUint64
()
&&
minItemsItr
->
value
.
GetUint64
()
<=
SizeType
(
~
0
))
minItems_
=
static_cast
<
SizeType
>
(
minItemsItr
->
value
.
GetUint64
());
...
...
@@ -365,7 +369,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
maxItemsItr
=
value
.
FindMember
(
Value
(
"maxItems"
));
typename
ValueType
::
ConstMemberIterator
maxItemsItr
=
value
.
FindMember
(
Value
(
"maxItems"
).
Move
(
));
if
(
maxItemsItr
!=
value
.
MemberEnd
())
{
if
(
maxItemsItr
->
value
.
IsUint64
()
&&
maxItemsItr
->
value
.
GetUint64
()
<=
SizeType
(
~
0
))
maxItems_
=
static_cast
<
SizeType
>
(
maxItemsItr
->
value
.
GetUint64
());
...
...
@@ -416,8 +420,8 @@ public:
private
:
TypelessSchema
<
Encoding
>
typeless_
;
BaseSchema
*
itemsList_
;
BaseSchema
**
itemsTuple_
;
BaseSchema
<
Encoding
>
*
itemsList_
;
BaseSchema
<
Encoding
>
**
itemsTuple_
;
SizeType
itemsTupleCount_
;
SizeType
minItems_
;
SizeType
maxItems_
;
...
...
@@ -426,13 +430,16 @@ private:
template
<
typename
Encoding
>
class
StringSchema
:
public
BaseSchema
<
Encoding
>
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
typedef
SchemaValidationContext
<
Encoding
>
Context
;
template
<
typename
ValueType
>
StringSchema
(
const
ValueType
&
value
)
:
BaseSchema
<
Encoding
>
(
value
),
minLength_
(
0
),
maxLength_
(
~
SizeType
(
0
))
{
ValueType
::
ConstMemberIterator
minLengthItr
=
value
.
FindMember
(
Value
(
"minLength"
));
typename
ValueType
::
ConstMemberIterator
minLengthItr
=
value
.
FindMember
(
Value
(
"minLength"
).
Move
(
));
if
(
minLengthItr
!=
value
.
MemberEnd
())
{
if
(
minLengthItr
->
value
.
IsUint64
()
&&
minLengthItr
->
value
.
GetUint64
()
<=
~
SizeType
(
0
))
minLength_
=
static_cast
<
SizeType
>
(
minLengthItr
->
value
.
GetUint64
());
...
...
@@ -441,7 +448,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
maxLengthItr
=
value
.
FindMember
(
Value
(
"maxLength"
));
typename
ValueType
::
ConstMemberIterator
maxLengthItr
=
value
.
FindMember
(
Value
(
"maxLength"
).
Move
(
));
if
(
maxLengthItr
!=
value
.
MemberEnd
())
{
if
(
maxLengthItr
->
value
.
IsUint64
()
&&
maxLengthItr
->
value
.
GetUint64
()
<=
~
SizeType
(
0
))
maxLength_
=
static_cast
<
SizeType
>
(
maxLengthItr
->
value
.
GetUint64
());
...
...
@@ -460,7 +467,7 @@ public:
virtual
bool
Double
(
double
)
const
{
return
false
;
}
virtual
bool
String
(
const
Ch
*
str
,
SizeType
length
,
bool
copy
)
const
{
return
BaseSchema
::
String
(
str
,
length
,
copy
)
&&
length
>=
minLength_
&&
length
<=
maxLength_
;
return
BaseSchema
<
Encoding
>
::
String
(
str
,
length
,
copy
)
&&
length
>=
minLength_
&&
length
<=
maxLength_
;
}
virtual
bool
StartArray
(
Context
&
)
const
{
return
true
;
}
...
...
@@ -474,6 +481,9 @@ private:
template
<
typename
Encoding
>
class
IntegerSchema
:
public
BaseSchema
<
Encoding
>
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
typedef
SchemaValidationContext
<
Encoding
>
Context
;
template
<
typename
ValueType
>
IntegerSchema
(
const
ValueType
&
value
)
:
BaseSchema
<
Encoding
>
(
value
),
...
...
@@ -481,7 +491,7 @@ public:
exclusiveMinimum_
(
false
),
exclusiveMaximum_
(
false
)
{
ValueType
::
ConstMemberIterator
minimumItr
=
value
.
FindMember
(
Value
(
"minimum"
));
typename
ValueType
::
ConstMemberIterator
minimumItr
=
value
.
FindMember
(
Value
(
"minimum"
).
Move
(
));
if
(
minimumItr
!=
value
.
MemberEnd
())
{
if
(
minimumItr
->
value
.
IsInt64
())
minimum_
.
SetInt64
(
minimumItr
->
value
.
GetInt64
());
...
...
@@ -492,7 +502,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
maximumItr
=
value
.
FindMember
(
Value
(
"maximum"
));
typename
ValueType
::
ConstMemberIterator
maximumItr
=
value
.
FindMember
(
Value
(
"maximum"
).
Move
(
));
if
(
maximumItr
!=
value
.
MemberEnd
())
{
if
(
maximumItr
->
value
.
IsInt64
())
maximum_
.
SetInt64
(
maximumItr
->
value
.
GetInt64
());
...
...
@@ -503,7 +513,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
exclusiveMinimumItr
=
value
.
FindMember
(
Value
(
"exclusiveMinimum"
));
typename
ValueType
::
ConstMemberIterator
exclusiveMinimumItr
=
value
.
FindMember
(
Value
(
"exclusiveMinimum"
).
Move
(
));
if
(
exclusiveMinimumItr
!=
value
.
MemberEnd
())
{
if
(
exclusiveMinimumItr
->
value
.
IsBool
())
exclusiveMinimum_
=
exclusiveMinimumItr
->
value
.
GetBool
();
...
...
@@ -512,7 +522,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
exclusiveMaximumItr
=
value
.
FindMember
(
Value
(
"exclusiveMaximum"
));
typename
ValueType
::
ConstMemberIterator
exclusiveMaximumItr
=
value
.
FindMember
(
Value
(
"exclusiveMaximum"
).
Move
(
));
if
(
exclusiveMaximumItr
!=
value
.
MemberEnd
())
{
if
(
exclusiveMaximumItr
->
value
.
IsBool
())
exclusiveMaximum_
=
exclusiveMaximumItr
->
value
.
GetBool
();
...
...
@@ -521,7 +531,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
multipleOfItr
=
value
.
FindMember
(
Value
(
"multipleOf"
));
typename
ValueType
::
ConstMemberIterator
multipleOfItr
=
value
.
FindMember
(
Value
(
"multipleOf"
).
Move
(
));
if
(
multipleOfItr
!=
value
.
MemberEnd
())
{
if
(
multipleOfItr
->
value
.
IsUint64
())
multipleOf_
=
multipleOfItr
->
value
.
GetUint64
();
...
...
@@ -534,10 +544,10 @@ public:
virtual
bool
Null
()
const
{
return
false
;
}
virtual
bool
Bool
(
bool
)
const
{
return
false
;
}
virtual
bool
Int
(
int
i
)
const
{
return
BaseSchema
::
Int64
(
i
)
&&
Int64
(
i
);
}
virtual
bool
Uint
(
unsigned
u
)
const
{
return
BaseSchema
::
Uint64
(
u
)
&&
Uint64
(
u
);
}
virtual
bool
Int64
(
int64_t
i
)
const
{
return
BaseSchema
::
Int64
(
i
)
&&
CheckInt64
(
i
);
}
virtual
bool
Uint64
(
uint64_t
u
)
const
{
return
BaseSchema
::
Uint64
(
u
)
&&
CheckUint64
(
u
);
}
virtual
bool
Int
(
int
i
)
const
{
return
BaseSchema
<
Encoding
>
::
Int64
(
i
)
&&
Int64
(
i
);
}
virtual
bool
Uint
(
unsigned
u
)
const
{
return
BaseSchema
<
Encoding
>
::
Uint64
(
u
)
&&
Uint64
(
u
);
}
virtual
bool
Int64
(
int64_t
i
)
const
{
return
BaseSchema
<
Encoding
>
::
Int64
(
i
)
&&
CheckInt64
(
i
);
}
virtual
bool
Uint64
(
uint64_t
u
)
const
{
return
BaseSchema
<
Encoding
>
::
Uint64
(
u
)
&&
CheckUint64
(
u
);
}
virtual
bool
Double
(
double
)
const
{
return
false
;
}
virtual
bool
String
(
const
Ch
*
,
SizeType
,
bool
)
const
{
return
false
;
}
...
...
@@ -615,6 +625,9 @@ private:
template
<
typename
Encoding
>
class
NumberSchema
:
public
BaseSchema
<
Encoding
>
{
public
:
typedef
typename
Encoding
::
Ch
Ch
;
typedef
SchemaValidationContext
<
Encoding
>
Context
;
template
<
typename
ValueType
>
NumberSchema
(
const
ValueType
&
value
)
:
BaseSchema
<
Encoding
>
(
value
),
...
...
@@ -625,7 +638,7 @@ public:
exclusiveMinimum_
(
false
),
exclusiveMaximum_
(
false
)
{
ValueType
::
ConstMemberIterator
minimumItr
=
value
.
FindMember
(
Value
(
"minimum"
));
typename
ValueType
::
ConstMemberIterator
minimumItr
=
value
.
FindMember
(
Value
(
"minimum"
).
Move
(
));
if
(
minimumItr
!=
value
.
MemberEnd
())
{
if
(
minimumItr
->
value
.
IsNumber
())
minimum_
=
minimumItr
->
value
.
GetDouble
();
...
...
@@ -634,7 +647,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
maximumItr
=
value
.
FindMember
(
Value
(
"maximum"
));
typename
ValueType
::
ConstMemberIterator
maximumItr
=
value
.
FindMember
(
Value
(
"maximum"
).
Move
(
));
if
(
maximumItr
!=
value
.
MemberEnd
())
{
if
(
maximumItr
->
value
.
IsNumber
())
maximum_
=
maximumItr
->
value
.
GetDouble
();
...
...
@@ -643,7 +656,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
exclusiveMinimumItr
=
value
.
FindMember
(
Value
(
"exclusiveMinimum"
));
typename
ValueType
::
ConstMemberIterator
exclusiveMinimumItr
=
value
.
FindMember
(
Value
(
"exclusiveMinimum"
).
Move
(
));
if
(
exclusiveMinimumItr
!=
value
.
MemberEnd
())
{
if
(
exclusiveMinimumItr
->
value
.
IsBool
())
exclusiveMinimum_
=
exclusiveMinimumItr
->
value
.
GetBool
();
...
...
@@ -652,7 +665,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
exclusiveMaximumItr
=
value
.
FindMember
(
Value
(
"exclusiveMaximum"
));
typename
ValueType
::
ConstMemberIterator
exclusiveMaximumItr
=
value
.
FindMember
(
Value
(
"exclusiveMaximum"
).
Move
(
));
if
(
exclusiveMaximumItr
!=
value
.
MemberEnd
())
{
if
(
exclusiveMaximumItr
->
value
.
IsBool
())
exclusiveMaximum_
=
exclusiveMaximumItr
->
value
.
GetBool
();
...
...
@@ -661,7 +674,7 @@ public:
}
}
ValueType
::
ConstMemberIterator
multipleOfItr
=
value
.
FindMember
(
Value
(
"multipleOf"
));
typename
ValueType
::
ConstMemberIterator
multipleOfItr
=
value
.
FindMember
(
Value
(
"multipleOf"
).
Move
(
));
if
(
multipleOfItr
!=
value
.
MemberEnd
())
{
if
(
multipleOfItr
->
value
.
IsNumber
())
{
multipleOf_
=
multipleOfItr
->
value
.
GetDouble
();
...
...
@@ -676,11 +689,11 @@ public:
virtual
bool
Null
()
const
{
return
false
;
}
virtual
bool
Bool
(
bool
)
const
{
return
false
;
}
virtual
bool
Int
(
int
i
)
const
{
return
BaseSchema
::
Int
(
i
)
&&
CheckDouble
(
i
);
}
virtual
bool
Uint
(
unsigned
u
)
const
{
return
BaseSchema
::
Uint
(
u
)
&&
CheckDouble
(
u
);
}
virtual
bool
Int64
(
int64_t
i
)
const
{
return
BaseSchema
::
Int64
(
i
)
&&
CheckDouble
(
i
);
}
virtual
bool
Uint64
(
uint64_t
u
)
const
{
return
BaseSchema
::
Uint64
(
u
)
&&
CheckDouble
(
u
);
}
virtual
bool
Double
(
double
d
)
const
{
return
BaseSchema
::
Double
(
d
)
&&
CheckDouble
(
d
);
}
virtual
bool
Int
(
int
i
)
const
{
return
BaseSchema
<
Encoding
>
::
Int
(
i
)
&&
CheckDouble
(
i
);
}
virtual
bool
Uint
(
unsigned
u
)
const
{
return
BaseSchema
<
Encoding
>
::
Uint
(
u
)
&&
CheckDouble
(
u
);
}
virtual
bool
Int64
(
int64_t
i
)
const
{
return
BaseSchema
<
Encoding
>
::
Int64
(
i
)
&&
CheckDouble
(
i
);
}
virtual
bool
Uint64
(
uint64_t
u
)
const
{
return
BaseSchema
<
Encoding
>
::
Uint64
(
u
)
&&
CheckDouble
(
u
);
}
virtual
bool
Double
(
double
d
)
const
{
return
BaseSchema
<
Encoding
>
::
Double
(
d
)
&&
CheckDouble
(
d
);
}
virtual
bool
String
(
const
Ch
*
,
SizeType
,
bool
)
const
{
return
false
;
}
virtual
bool
StartObject
(
Context
&
)
const
{
return
false
;
}
...
...
@@ -705,15 +718,33 @@ private:
bool
exclusiveMaximum_
;
};
template
<
typename
Encoding
,
typename
ValueType
>
inline
BaseSchema
<
Encoding
>*
CreateSchema
(
const
ValueType
&
value
)
{
if
(
!
value
.
IsObject
())
return
0
;
typename
ValueType
::
ConstMemberIterator
typeItr
=
value
.
FindMember
(
"type"
);
if
(
typeItr
==
value
.
MemberEnd
())
return
new
TypelessSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"null"
).
Move
())
return
new
NullSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"boolean"
).
Move
())
return
new
BooleanSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"object"
).
Move
())
return
new
ObjectSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"array"
).
Move
())
return
new
ArraySchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"string"
).
Move
())
return
new
StringSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"integer"
).
Move
())
return
new
IntegerSchema
<
Encoding
>
(
value
);
else
if
(
typeItr
->
value
==
Value
(
"number"
).
Move
())
return
new
NumberSchema
<
Encoding
>
(
value
);
else
return
0
;
}
template
<
typename
Encoding
,
typename
Allocator
=
MemoryPoolAllocator
<>
>
class
GenericSchema
{
public
:
template
<
typename
Encoding
,
typename
OutputHandler
,
typename
Allocator
>
template
<
typename
T1
,
typename
T2
,
typename
T3
>
friend
class
GenericSchemaValidator
;
template
<
typename
DocumentType
>
GenericSchema
(
const
DocumentType
&
document
)
:
root_
()
{
root_
=
CreateSchema
<
Encoding
,
DocumentType
::
ValueType
>
(
document
);
root_
=
CreateSchema
<
Encoding
,
typename
DocumentType
::
ValueType
>
(
document
);
}
~
GenericSchema
()
{
...
...
@@ -767,13 +798,13 @@ public:
documentStack_
.
Clear
();
};
bool
Null
()
{
BeginValue
();
return
PopSchema
().
Null
()
?
outputHandler_
.
Null
()
:
false
;
}
bool
Null
()
{
BeginValue
();
return
PopSchema
().
Null
()
?
outputHandler_
.
Null
()
:
false
;
}
bool
Bool
(
bool
b
)
{
BeginValue
();
return
PopSchema
().
Bool
(
b
)
?
outputHandler_
.
Bool
(
b
)
:
false
;
}
bool
Int
(
int
i
)
{
BeginValue
();
return
PopSchema
().
Int
(
i
)
?
outputHandler_
.
Int
(
i
)
:
false
;
}
bool
Uint
(
unsigned
u
)
{
BeginValue
();
return
PopSchema
().
Uint
(
u
)
?
outputHandler_
.
Uint
(
u
)
:
false
;
}
bool
Int64
(
int64_t
i64
)
{
BeginValue
();
return
PopSchema
().
Int64
(
i64
)
?
outputHandler_
.
Int64
(
i64
)
:
false
;
}
bool
Uint64
(
uint64_t
u64
)
{
BeginValue
();
return
PopSchema
().
Uint64
(
u64
)
?
outputHandler_
.
Uint64
(
u64
)
:
false
;
}
bool
Double
(
double
d
)
{
BeginValue
();
return
PopSchema
().
Double
(
d
)
?
outputHandler_
.
Double
(
d
)
:
false
;
}
bool
Double
(
double
d
)
{
BeginValue
();
return
PopSchema
().
Double
(
d
)
?
outputHandler_
.
Double
(
d
)
:
false
;
}
bool
String
(
const
Ch
*
str
,
SizeType
length
,
bool
copy
)
{
BeginValue
();
return
PopSchema
().
String
(
str
,
length
,
copy
)
?
outputHandler_
.
String
(
str
,
length
,
copy
)
:
false
;
}
bool
StartObject
()
{
BeginValue
();
return
CurrentSchema
().
StartObject
(
CurrentContext
())
?
outputHandler_
.
StartObject
()
:
false
;
}
bool
Key
(
const
Ch
*
str
,
SizeType
len
,
bool
copy
)
{
return
CurrentSchema
().
Key
(
CurrentContext
(),
str
,
len
,
copy
)
?
outputHandler_
.
Key
(
str
,
len
,
copy
)
:
false
;
}
...
...
@@ -815,8 +846,8 @@ private:
void
PushSchema
(
const
BaseSchemaType
&
schema
)
{
*
schemaStack_
.
template
Push
<
Context
>
()
=
Context
(
&
schema
);
}
const
BaseSchemaType
&
PopSchema
()
{
return
*
schemaStack_
.
template
Pop
<
Context
>
(
1
)
->
schema
;
}
const
BaseSchemaType
&
CurrentSchema
()
{
return
*
schemaStack_
.
Top
<
Context
>
()
->
schema
;
}
Context
&
CurrentContext
()
{
return
*
schemaStack_
.
Top
<
Context
>
();
}
const
BaseSchemaType
&
CurrentSchema
()
{
return
*
schemaStack_
.
template
Top
<
Context
>
()
->
schema
;
}
Context
&
CurrentContext
()
{
return
*
schemaStack_
.
template
Top
<
Context
>
();
}
static
const
size_t
kDefaultSchemaStackCapacity
=
256
;
static
const
size_t
kDefaultDocumentStackCapacity
=
256
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment