Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
gaoqiong
yaml-cpp
Commits
434c6a56
Commit
434c6a56
authored
Apr 12, 2013
by
Jesse Beder
Browse files
Add better exception reporting when incorrectly dereferencing an iterator.
parent
097ac171
Changes
5
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
121 additions
and
12 deletions
+121
-12
include/yaml-cpp/exceptions.h
include/yaml-cpp/exceptions.h
+8
-1
include/yaml-cpp/node/impl.h
include/yaml-cpp/node/impl.h
+74
-6
include/yaml-cpp/node/iterator.h
include/yaml-cpp/node/iterator.h
+2
-2
include/yaml-cpp/node/node.h
include/yaml-cpp/node/node.h
+4
-0
test/new-api/nodetests.cpp
test/new-api/nodetests.cpp
+33
-3
No files found.
include/yaml-cpp/exceptions.h
View file @
434c6a56
...
@@ -55,6 +55,7 @@ namespace YAML
...
@@ -55,6 +55,7 @@ namespace YAML
const
char
*
const
AMBIGUOUS_ANCHOR
=
"cannot assign the same alias to multiple nodes"
;
const
char
*
const
AMBIGUOUS_ANCHOR
=
"cannot assign the same alias to multiple nodes"
;
const
char
*
const
UNKNOWN_ANCHOR
=
"the referenced anchor is not defined"
;
const
char
*
const
UNKNOWN_ANCHOR
=
"the referenced anchor is not defined"
;
const
char
*
const
INVALID_NODE
=
"invalid node; this may result from using a map iterator as a sequence iterator, or vice-versa"
;
const
char
*
const
INVALID_SCALAR
=
"invalid scalar"
;
const
char
*
const
INVALID_SCALAR
=
"invalid scalar"
;
const
char
*
const
KEY_NOT_FOUND
=
"key not found"
;
const
char
*
const
KEY_NOT_FOUND
=
"key not found"
;
const
char
*
const
BAD_CONVERSION
=
"bad conversion"
;
const
char
*
const
BAD_CONVERSION
=
"bad conversion"
;
...
@@ -149,6 +150,12 @@ namespace YAML
...
@@ -149,6 +150,12 @@ namespace YAML
return
TypedKeyNotFound
<
T
>
(
mark
,
key
);
return
TypedKeyNotFound
<
T
>
(
mark
,
key
);
}
}
class
InvalidNode
:
public
RepresentationException
{
public:
InvalidNode
()
:
RepresentationException
(
Mark
::
null_mark
(),
ErrorMsg
::
INVALID_NODE
)
{}
};
class
BadConversion
:
public
RepresentationException
{
class
BadConversion
:
public
RepresentationException
{
public:
public:
BadConversion
()
BadConversion
()
...
...
include/yaml-cpp/node/impl.h
View file @
434c6a56
...
@@ -15,30 +15,34 @@
...
@@ -15,30 +15,34 @@
namespace
YAML
namespace
YAML
{
{
inline
Node
::
Node
()
:
m_pNode
(
NULL
)
inline
Node
::
Node
()
:
m_isValid
(
true
),
m_pNode
(
NULL
)
{
{
}
}
inline
Node
::
Node
(
NodeType
::
value
type
)
:
m_pMemory
(
new
detail
::
memory_holder
),
m_pNode
(
&
m_pMemory
->
create_node
())
inline
Node
::
Node
(
NodeType
::
value
type
)
:
m_isValid
(
true
),
m_pMemory
(
new
detail
::
memory_holder
),
m_pNode
(
&
m_pMemory
->
create_node
())
{
{
m_pNode
->
set_type
(
type
);
m_pNode
->
set_type
(
type
);
}
}
template
<
typename
T
>
template
<
typename
T
>
inline
Node
::
Node
(
const
T
&
rhs
)
:
m_pMemory
(
new
detail
::
memory_holder
),
m_pNode
(
&
m_pMemory
->
create_node
())
inline
Node
::
Node
(
const
T
&
rhs
)
:
m_isValid
(
true
),
m_pMemory
(
new
detail
::
memory_holder
),
m_pNode
(
&
m_pMemory
->
create_node
())
{
{
Assign
(
rhs
);
Assign
(
rhs
);
}
}
inline
Node
::
Node
(
const
detail
::
iterator_value
&
rhs
)
:
m_pMemory
(
rhs
.
m_pMemory
),
m_pNode
(
rhs
.
m_pNode
)
inline
Node
::
Node
(
const
detail
::
iterator_value
&
rhs
)
:
m_isValid
(
rhs
.
m_isValid
),
m_pMemory
(
rhs
.
m_pMemory
),
m_pNode
(
rhs
.
m_pNode
)
{
{
}
}
inline
Node
::
Node
(
const
Node
&
rhs
)
:
m_pMemory
(
rhs
.
m_pMemory
),
m_pNode
(
rhs
.
m_pNode
)
inline
Node
::
Node
(
const
Node
&
rhs
)
:
m_isValid
(
rhs
.
m_isValid
),
m_pMemory
(
rhs
.
m_pMemory
),
m_pNode
(
rhs
.
m_pNode
)
{
{
}
}
inline
Node
::
Node
(
detail
::
node
&
node
,
detail
::
shared_memory_holder
pMemory
)
:
m_pMemory
(
pMemory
),
m_pNode
(
&
node
)
inline
Node
::
Node
(
Zombie
)
:
m_isValid
(
false
),
m_pNode
(
NULL
)
{
}
inline
Node
::
Node
(
detail
::
node
&
node
,
detail
::
shared_memory_holder
pMemory
)
:
m_isValid
(
true
),
m_pMemory
(
pMemory
),
m_pNode
(
&
node
)
{
{
}
}
...
@@ -48,6 +52,8 @@ namespace YAML
...
@@ -48,6 +52,8 @@ namespace YAML
inline
void
Node
::
EnsureNodeExists
()
const
inline
void
Node
::
EnsureNodeExists
()
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
if
(
!
m_pNode
)
{
if
(
!
m_pNode
)
{
m_pMemory
.
reset
(
new
detail
::
memory_holder
);
m_pMemory
.
reset
(
new
detail
::
memory_holder
);
m_pNode
=
&
m_pMemory
->
create_node
();
m_pNode
=
&
m_pMemory
->
create_node
();
...
@@ -57,11 +63,15 @@ namespace YAML
...
@@ -57,11 +63,15 @@ namespace YAML
inline
bool
Node
::
IsDefined
()
const
inline
bool
Node
::
IsDefined
()
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
m_pNode
?
m_pNode
->
is_defined
()
:
true
;
return
m_pNode
?
m_pNode
->
is_defined
()
:
true
;
}
}
inline
NodeType
::
value
Node
::
Type
()
const
inline
NodeType
::
value
Node
::
Type
()
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
m_pNode
?
m_pNode
->
type
()
:
NodeType
::
Null
;
return
m_pNode
?
m_pNode
->
type
()
:
NodeType
::
Null
;
}
}
...
@@ -128,27 +138,37 @@ namespace YAML
...
@@ -128,27 +138,37 @@ namespace YAML
template
<
typename
T
>
template
<
typename
T
>
inline
const
T
Node
::
as
()
const
inline
const
T
Node
::
as
()
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
as_if
<
T
,
void
>
(
*
this
)();
return
as_if
<
T
,
void
>
(
*
this
)();
}
}
template
<
typename
T
,
typename
S
>
template
<
typename
T
,
typename
S
>
inline
const
T
Node
::
as
(
const
S
&
fallback
)
const
inline
const
T
Node
::
as
(
const
S
&
fallback
)
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
as_if
<
T
,
S
>
(
*
this
)(
fallback
);
return
as_if
<
T
,
S
>
(
*
this
)(
fallback
);
}
}
inline
const
std
::
string
&
Node
::
Scalar
()
const
inline
const
std
::
string
&
Node
::
Scalar
()
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
m_pNode
?
m_pNode
->
scalar
()
:
detail
::
node_data
::
empty_scalar
;
return
m_pNode
?
m_pNode
->
scalar
()
:
detail
::
node_data
::
empty_scalar
;
}
}
inline
const
std
::
string
&
Node
::
Tag
()
const
inline
const
std
::
string
&
Node
::
Tag
()
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
m_pNode
?
m_pNode
->
tag
()
:
detail
::
node_data
::
empty_scalar
;
return
m_pNode
?
m_pNode
->
tag
()
:
detail
::
node_data
::
empty_scalar
;
}
}
inline
void
Node
::
SetTag
(
const
std
::
string
&
tag
)
inline
void
Node
::
SetTag
(
const
std
::
string
&
tag
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
m_pNode
->
set_tag
(
tag
);
m_pNode
->
set_tag
(
tag
);
}
}
...
@@ -156,6 +176,8 @@ namespace YAML
...
@@ -156,6 +176,8 @@ namespace YAML
// assignment
// assignment
inline
bool
Node
::
is
(
const
Node
&
rhs
)
const
inline
bool
Node
::
is
(
const
Node
&
rhs
)
const
{
{
if
(
!
m_isValid
||
!
rhs
.
m_isValid
)
throw
InvalidNode
();
if
(
!
m_pNode
||
!
rhs
.
m_pNode
)
if
(
!
m_pNode
||
!
rhs
.
m_pNode
)
return
false
;
return
false
;
return
m_pNode
->
is
(
*
rhs
.
m_pNode
);
return
m_pNode
->
is
(
*
rhs
.
m_pNode
);
...
@@ -164,12 +186,16 @@ namespace YAML
...
@@ -164,12 +186,16 @@ namespace YAML
template
<
typename
T
>
template
<
typename
T
>
inline
Node
&
Node
::
operator
=
(
const
T
&
rhs
)
inline
Node
&
Node
::
operator
=
(
const
T
&
rhs
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
Assign
(
rhs
);
Assign
(
rhs
);
return
*
this
;
return
*
this
;
}
}
inline
void
Node
::
reset
(
const
YAML
::
Node
&
rhs
)
inline
void
Node
::
reset
(
const
YAML
::
Node
&
rhs
)
{
{
if
(
!
m_isValid
||
!
rhs
.
m_isValid
)
throw
InvalidNode
();
m_pMemory
=
rhs
.
m_pMemory
;
m_pMemory
=
rhs
.
m_pMemory
;
m_pNode
=
rhs
.
m_pNode
;
m_pNode
=
rhs
.
m_pNode
;
}
}
...
@@ -177,30 +203,40 @@ namespace YAML
...
@@ -177,30 +203,40 @@ namespace YAML
template
<
typename
T
>
template
<
typename
T
>
inline
void
Node
::
Assign
(
const
T
&
rhs
)
inline
void
Node
::
Assign
(
const
T
&
rhs
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
AssignData
(
convert
<
T
>::
encode
(
rhs
));
AssignData
(
convert
<
T
>::
encode
(
rhs
));
}
}
template
<
>
template
<
>
inline
void
Node
::
Assign
(
const
std
::
string
&
rhs
)
inline
void
Node
::
Assign
(
const
std
::
string
&
rhs
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
m_pNode
->
set_scalar
(
rhs
);
m_pNode
->
set_scalar
(
rhs
);
}
}
inline
void
Node
::
Assign
(
const
char
*
rhs
)
inline
void
Node
::
Assign
(
const
char
*
rhs
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
m_pNode
->
set_scalar
(
rhs
);
m_pNode
->
set_scalar
(
rhs
);
}
}
inline
void
Node
::
Assign
(
char
*
rhs
)
inline
void
Node
::
Assign
(
char
*
rhs
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
m_pNode
->
set_scalar
(
rhs
);
m_pNode
->
set_scalar
(
rhs
);
}
}
inline
Node
&
Node
::
operator
=
(
const
Node
&
rhs
)
inline
Node
&
Node
::
operator
=
(
const
Node
&
rhs
)
{
{
if
(
!
m_isValid
||
!
rhs
.
m_isValid
)
throw
InvalidNode
();
if
(
is
(
rhs
))
if
(
is
(
rhs
))
return
*
this
;
return
*
this
;
AssignNode
(
rhs
);
AssignNode
(
rhs
);
...
@@ -209,6 +245,8 @@ namespace YAML
...
@@ -209,6 +245,8 @@ namespace YAML
inline
void
Node
::
AssignData
(
const
Node
&
rhs
)
inline
void
Node
::
AssignData
(
const
Node
&
rhs
)
{
{
if
(
!
m_isValid
||
!
rhs
.
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
rhs
.
EnsureNodeExists
();
rhs
.
EnsureNodeExists
();
...
@@ -218,6 +256,8 @@ namespace YAML
...
@@ -218,6 +256,8 @@ namespace YAML
inline
void
Node
::
AssignNode
(
const
Node
&
rhs
)
inline
void
Node
::
AssignNode
(
const
Node
&
rhs
)
{
{
if
(
!
m_isValid
||
!
rhs
.
m_isValid
)
throw
InvalidNode
();
rhs
.
EnsureNodeExists
();
rhs
.
EnsureNodeExists
();
if
(
!
m_pNode
)
{
if
(
!
m_pNode
)
{
...
@@ -234,26 +274,36 @@ namespace YAML
...
@@ -234,26 +274,36 @@ namespace YAML
// size/iterator
// size/iterator
inline
std
::
size_t
Node
::
size
()
const
inline
std
::
size_t
Node
::
size
()
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
m_pNode
?
m_pNode
->
size
()
:
0
;
return
m_pNode
?
m_pNode
->
size
()
:
0
;
}
}
inline
const_iterator
Node
::
begin
()
const
inline
const_iterator
Node
::
begin
()
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
m_pNode
?
const_iterator
(
m_pNode
->
begin
(),
m_pMemory
)
:
const_iterator
();
return
m_pNode
?
const_iterator
(
m_pNode
->
begin
(),
m_pMemory
)
:
const_iterator
();
}
}
inline
iterator
Node
::
begin
()
inline
iterator
Node
::
begin
()
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
m_pNode
?
iterator
(
m_pNode
->
begin
(),
m_pMemory
)
:
iterator
();
return
m_pNode
?
iterator
(
m_pNode
->
begin
(),
m_pMemory
)
:
iterator
();
}
}
inline
const_iterator
Node
::
end
()
const
inline
const_iterator
Node
::
end
()
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
m_pNode
?
const_iterator
(
m_pNode
->
end
(),
m_pMemory
)
:
const_iterator
();
return
m_pNode
?
const_iterator
(
m_pNode
->
end
(),
m_pMemory
)
:
const_iterator
();
}
}
inline
iterator
Node
::
end
()
inline
iterator
Node
::
end
()
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
return
m_pNode
?
iterator
(
m_pNode
->
end
(),
m_pMemory
)
:
iterator
();
return
m_pNode
?
iterator
(
m_pNode
->
end
(),
m_pMemory
)
:
iterator
();
}
}
...
@@ -261,11 +311,15 @@ namespace YAML
...
@@ -261,11 +311,15 @@ namespace YAML
template
<
typename
T
>
template
<
typename
T
>
inline
void
Node
::
push_back
(
const
T
&
rhs
)
inline
void
Node
::
push_back
(
const
T
&
rhs
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
push_back
(
Node
(
rhs
));
push_back
(
Node
(
rhs
));
}
}
inline
void
Node
::
push_back
(
const
Node
&
rhs
)
inline
void
Node
::
push_back
(
const
Node
&
rhs
)
{
{
if
(
!
m_isValid
||
!
rhs
.
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
rhs
.
EnsureNodeExists
();
rhs
.
EnsureNodeExists
();
...
@@ -322,6 +376,8 @@ namespace YAML
...
@@ -322,6 +376,8 @@ namespace YAML
template
<
typename
Key
>
template
<
typename
Key
>
inline
const
Node
Node
::
operator
[](
const
Key
&
key
)
const
inline
const
Node
Node
::
operator
[](
const
Key
&
key
)
const
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
detail
::
node
&
value
=
static_cast
<
const
detail
::
node
&>
(
*
m_pNode
).
get
(
detail
::
to_value
(
key
),
m_pMemory
);
detail
::
node
&
value
=
static_cast
<
const
detail
::
node
&>
(
*
m_pNode
).
get
(
detail
::
to_value
(
key
),
m_pMemory
);
return
Node
(
value
,
m_pMemory
);
return
Node
(
value
,
m_pMemory
);
...
@@ -330,6 +386,8 @@ namespace YAML
...
@@ -330,6 +386,8 @@ namespace YAML
template
<
typename
Key
>
template
<
typename
Key
>
inline
Node
Node
::
operator
[](
const
Key
&
key
)
inline
Node
Node
::
operator
[](
const
Key
&
key
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
detail
::
node
&
value
=
m_pNode
->
get
(
detail
::
to_value
(
key
),
m_pMemory
);
detail
::
node
&
value
=
m_pNode
->
get
(
detail
::
to_value
(
key
),
m_pMemory
);
return
Node
(
value
,
m_pMemory
);
return
Node
(
value
,
m_pMemory
);
...
@@ -338,12 +396,16 @@ namespace YAML
...
@@ -338,12 +396,16 @@ namespace YAML
template
<
typename
Key
>
template
<
typename
Key
>
inline
bool
Node
::
remove
(
const
Key
&
key
)
inline
bool
Node
::
remove
(
const
Key
&
key
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
return
m_pNode
->
remove
(
detail
::
to_value
(
key
),
m_pMemory
);
return
m_pNode
->
remove
(
detail
::
to_value
(
key
),
m_pMemory
);
}
}
inline
const
Node
Node
::
operator
[](
const
Node
&
key
)
const
inline
const
Node
Node
::
operator
[](
const
Node
&
key
)
const
{
{
if
(
!
m_isValid
||
!
key
.
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
key
.
EnsureNodeExists
();
key
.
EnsureNodeExists
();
detail
::
node
&
value
=
static_cast
<
const
detail
::
node
&>
(
*
m_pNode
).
get
(
*
key
.
m_pNode
,
m_pMemory
);
detail
::
node
&
value
=
static_cast
<
const
detail
::
node
&>
(
*
m_pNode
).
get
(
*
key
.
m_pNode
,
m_pMemory
);
...
@@ -352,6 +414,8 @@ namespace YAML
...
@@ -352,6 +414,8 @@ namespace YAML
inline
Node
Node
::
operator
[](
const
Node
&
key
)
inline
Node
Node
::
operator
[](
const
Node
&
key
)
{
{
if
(
!
m_isValid
||
!
key
.
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
key
.
EnsureNodeExists
();
key
.
EnsureNodeExists
();
detail
::
node
&
value
=
m_pNode
->
get
(
*
key
.
m_pNode
,
m_pMemory
);
detail
::
node
&
value
=
m_pNode
->
get
(
*
key
.
m_pNode
,
m_pMemory
);
...
@@ -360,6 +424,8 @@ namespace YAML
...
@@ -360,6 +424,8 @@ namespace YAML
inline
bool
Node
::
remove
(
const
Node
&
key
)
inline
bool
Node
::
remove
(
const
Node
&
key
)
{
{
if
(
!
m_isValid
||
!
key
.
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
key
.
EnsureNodeExists
();
key
.
EnsureNodeExists
();
return
m_pNode
->
remove
(
*
key
.
m_pNode
,
m_pMemory
);
return
m_pNode
->
remove
(
*
key
.
m_pNode
,
m_pMemory
);
...
@@ -369,6 +435,8 @@ namespace YAML
...
@@ -369,6 +435,8 @@ namespace YAML
template
<
typename
Key
,
typename
Value
>
template
<
typename
Key
,
typename
Value
>
inline
void
Node
::
force_insert
(
const
Key
&
key
,
const
Value
&
value
)
inline
void
Node
::
force_insert
(
const
Key
&
key
,
const
Value
&
value
)
{
{
if
(
!
m_isValid
)
throw
InvalidNode
();
EnsureNodeExists
();
EnsureNodeExists
();
m_pNode
->
force_insert
(
detail
::
to_value
(
key
),
detail
::
to_value
(
value
),
m_pMemory
);
m_pNode
->
force_insert
(
detail
::
to_value
(
key
),
detail
::
to_value
(
value
),
m_pMemory
);
}
}
...
...
include/yaml-cpp/node/iterator.h
View file @
434c6a56
...
@@ -19,8 +19,8 @@ namespace YAML
...
@@ -19,8 +19,8 @@ namespace YAML
namespace
detail
{
namespace
detail
{
struct
iterator_value
:
public
Node
,
std
::
pair
<
Node
,
Node
>
{
struct
iterator_value
:
public
Node
,
std
::
pair
<
Node
,
Node
>
{
iterator_value
()
{}
iterator_value
()
{}
explicit
iterator_value
(
const
Node
&
rhs
)
:
Node
(
rhs
)
{}
explicit
iterator_value
(
const
Node
&
rhs
)
:
Node
(
rhs
)
,
std
::
pair
<
Node
,
Node
>
(
Node
(
Node
::
ZombieNode
),
Node
(
Node
::
ZombieNode
))
{}
explicit
iterator_value
(
const
Node
&
key
,
const
Node
&
value
)
:
std
::
pair
<
Node
,
Node
>
(
key
,
value
)
{}
explicit
iterator_value
(
const
Node
&
key
,
const
Node
&
value
)
:
Node
(
Node
::
ZombieNode
),
std
::
pair
<
Node
,
Node
>
(
key
,
value
)
{}
};
};
}
}
}
}
...
...
include/yaml-cpp/node/node.h
View file @
434c6a56
...
@@ -20,6 +20,7 @@ namespace YAML
...
@@ -20,6 +20,7 @@ namespace YAML
public:
public:
friend
class
NodeBuilder
;
friend
class
NodeBuilder
;
friend
class
NodeEvents
;
friend
class
NodeEvents
;
friend
struct
detail
::
iterator_value
;
friend
class
detail
::
node_data
;
friend
class
detail
::
node_data
;
template
<
typename
>
friend
class
detail
::
iterator_base
;
template
<
typename
>
friend
class
detail
::
iterator_base
;
template
<
typename
T
,
typename
S
>
friend
struct
as_if
;
template
<
typename
T
,
typename
S
>
friend
struct
as_if
;
...
@@ -85,6 +86,8 @@ namespace YAML
...
@@ -85,6 +86,8 @@ namespace YAML
void
force_insert
(
const
Key
&
key
,
const
Value
&
value
);
void
force_insert
(
const
Key
&
key
,
const
Value
&
value
);
private:
private:
enum
Zombie
{
ZombieNode
};
explicit
Node
(
Zombie
);
explicit
Node
(
detail
::
node
&
node
,
detail
::
shared_memory_holder
pMemory
);
explicit
Node
(
detail
::
node
&
node
,
detail
::
shared_memory_holder
pMemory
);
void
EnsureNodeExists
()
const
;
void
EnsureNodeExists
()
const
;
...
@@ -97,6 +100,7 @@ namespace YAML
...
@@ -97,6 +100,7 @@ namespace YAML
void
AssignNode
(
const
Node
&
rhs
);
void
AssignNode
(
const
Node
&
rhs
);
private:
private:
bool
m_isValid
;
mutable
detail
::
shared_memory_holder
m_pMemory
;
mutable
detail
::
shared_memory_holder
m_pMemory
;
mutable
detail
::
node
*
m_pNode
;
mutable
detail
::
node
*
m_pNode
;
};
};
...
...
test/new-api/nodetests.cpp
View file @
434c6a56
...
@@ -8,15 +8,33 @@ namespace {
...
@@ -8,15 +8,33 @@ namespace {
TEST
()
:
ok
(
false
)
{}
TEST
()
:
ok
(
false
)
{}
TEST
(
bool
ok_
)
:
ok
(
ok_
)
{}
TEST
(
bool
ok_
)
:
ok
(
ok_
)
{}
TEST
(
const
char
*
error_
)
:
ok
(
false
),
error
(
error_
)
{}
TEST
(
const
char
*
error_
)
:
ok
(
false
),
error
(
error_
)
{}
TEST
(
const
std
::
string
&
error_
)
:
ok
(
false
),
error
(
error_
)
{}
bool
ok
;
bool
ok
;
std
::
string
error
;
std
::
string
error
;
};
};
}
}
#define YAML_ASSERT(cond) do { if(!(cond)) return " Assert failed: " #cond; } while(false)
#define YAML_ASSERT(cond)\
do {\
#define YAML_ASSERT_THROWS(cond, exc) do { try { (cond); return " Expression did not throw: " #cond; } catch(const exc&) {} catch(...) { return " Expression threw something other than " #exc ": " #cond; } } while(false)
if(!(cond))\
return " Assert failed: " #cond;\
} while(false)
#define YAML_ASSERT_THROWS(cond, exc)\
do {\
try {\
(cond);\
return " Expression did not throw: " #cond;\
} catch(const exc&) {\
} catch(const std::runtime_error& e) {\
std::stringstream stream;\
stream << " Expression threw runtime error ther than " #exc ":\n " #cond "\n " << e.what();\
return stream.str();\
} catch(...) {\
return " Expression threw unknown exception, other than " #exc ":\n " #cond;\
}\
} while(false)
namespace
Test
namespace
Test
{
{
...
@@ -319,7 +337,7 @@ namespace Test
...
@@ -319,7 +337,7 @@ namespace Test
YAML
::
Node
node
=
YAML
::
Load
(
"[1.5, 1, .nan, .inf, -.inf, 0x15, 015]"
);
YAML
::
Node
node
=
YAML
::
Load
(
"[1.5, 1, .nan, .inf, -.inf, 0x15, 015]"
);
YAML_ASSERT
(
node
[
0
].
as
<
float
>
()
==
1.5
f
);
YAML_ASSERT
(
node
[
0
].
as
<
float
>
()
==
1.5
f
);
YAML_ASSERT
(
node
[
0
].
as
<
double
>
()
==
1.5
);
YAML_ASSERT
(
node
[
0
].
as
<
double
>
()
==
1.5
);
YAML_ASSERT_THROWS
(
node
[
0
].
as
<
int
>
(),
std
::
runtime_error
);
YAML_ASSERT_THROWS
(
node
[
0
].
as
<
int
>
(),
YAML
::
TypedBadConversion
<
int
>
);
YAML_ASSERT
(
node
[
1
].
as
<
int
>
()
==
1
);
YAML_ASSERT
(
node
[
1
].
as
<
int
>
()
==
1
);
YAML_ASSERT
(
node
[
1
].
as
<
float
>
()
==
1.0
f
);
YAML_ASSERT
(
node
[
1
].
as
<
float
>
()
==
1.0
f
);
YAML_ASSERT
(
node
[
2
].
as
<
float
>
()
!=
node
[
2
].
as
<
float
>
());
YAML_ASSERT
(
node
[
2
].
as
<
float
>
()
!=
node
[
2
].
as
<
float
>
());
...
@@ -469,6 +487,17 @@ namespace Test
...
@@ -469,6 +487,17 @@ namespace Test
YAML_ASSERT
(
other
==
node
);
YAML_ASSERT
(
other
==
node
);
return
true
;
return
true
;
}
}
TEST
DereferenceIteratorError
()
{
YAML
::
Node
node
=
YAML
::
Load
(
"[{a: b}, 1, 2]"
);
YAML_ASSERT_THROWS
(
node
.
begin
()
->
first
.
as
<
int
>
(),
YAML
::
InvalidNode
);
YAML_ASSERT
((
*
node
.
begin
()).
IsMap
()
==
true
);
YAML_ASSERT
(
node
.
begin
()
->
IsMap
()
==
true
);
YAML_ASSERT_THROWS
((
*
node
.
begin
()
->
begin
()).
IsDefined
(),
YAML
::
InvalidNode
);
YAML_ASSERT_THROWS
(
node
.
begin
()
->
begin
()
->
IsDefined
(),
YAML
::
InvalidNode
);
return
true
;
}
}
}
void
RunNodeTest
(
TEST
(
*
test
)(),
const
std
::
string
&
name
,
int
&
passed
,
int
&
total
)
{
void
RunNodeTest
(
TEST
(
*
test
)(),
const
std
::
string
&
name
,
int
&
passed
,
int
&
total
)
{
...
@@ -530,6 +559,7 @@ namespace Test
...
@@ -530,6 +559,7 @@ namespace Test
RunNodeTest
(
&
Node
::
CloneAlias
,
"clone alias"
,
passed
,
total
);
RunNodeTest
(
&
Node
::
CloneAlias
,
"clone alias"
,
passed
,
total
);
RunNodeTest
(
&
Node
::
ForceInsertIntoMap
,
"force insert into map"
,
passed
,
total
);
RunNodeTest
(
&
Node
::
ForceInsertIntoMap
,
"force insert into map"
,
passed
,
total
);
RunNodeTest
(
&
Node
::
ResetNode
,
"reset node"
,
passed
,
total
);
RunNodeTest
(
&
Node
::
ResetNode
,
"reset node"
,
passed
,
total
);
RunNodeTest
(
&
Node
::
DereferenceIteratorError
,
"dereference iterator error"
,
passed
,
total
);
std
::
cout
<<
"Node tests: "
<<
passed
<<
"/"
<<
total
<<
" passed
\n
"
;
std
::
cout
<<
"Node tests: "
<<
passed
<<
"/"
<<
total
<<
" passed
\n
"
;
return
passed
==
total
;
return
passed
==
total
;
...
...
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