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
4fb1c4b9
Commit
4fb1c4b9
authored
May 14, 2018
by
Jiao
Committed by
Jesse Beder
May 14, 2018
Browse files
Enable items to be removed from a sequence (#582)
parent
ab5f9259
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
104 additions
and
18 deletions
+104
-18
.gitignore
.gitignore
+1
-0
include/yaml-cpp/node/detail/impl.h
include/yaml-cpp/node/detail/impl.h
+48
-15
src/node_data.cpp
src/node_data.cpp
+8
-0
test/node/node_test.cpp
test/node/node_test.cpp
+45
-3
util/CMakeLists.txt
util/CMakeLists.txt
+2
-0
No files found.
.gitignore
View file @
4fb1c4b9
build/
build/
/tags
include/yaml-cpp/node/detail/impl.h
View file @
4fb1c4b9
...
@@ -32,7 +32,7 @@ struct get_idx<Key,
...
@@ -32,7 +32,7 @@ struct get_idx<Key,
static
node
*
get
(
std
::
vector
<
node
*>&
sequence
,
const
Key
&
key
,
static
node
*
get
(
std
::
vector
<
node
*>&
sequence
,
const
Key
&
key
,
shared_memory_holder
pMemory
)
{
shared_memory_holder
pMemory
)
{
if
(
key
>
sequence
.
size
()
||
(
key
>
0
&&
!
sequence
[
key
-
1
]
->
is_defined
()))
if
(
key
>
sequence
.
size
()
||
(
key
>
0
&&
!
sequence
[
key
-
1
]
->
is_defined
()))
return
0
;
return
0
;
if
(
key
==
sequence
.
size
())
if
(
key
==
sequence
.
size
())
sequence
.
push_back
(
&
pMemory
->
create_node
());
sequence
.
push_back
(
&
pMemory
->
create_node
());
...
@@ -56,6 +56,37 @@ struct get_idx<Key, typename std::enable_if<std::is_signed<Key>::value>::type> {
...
@@ -56,6 +56,37 @@ struct get_idx<Key, typename std::enable_if<std::is_signed<Key>::value>::type> {
}
}
};
};
template
<
typename
Key
,
typename
Enable
=
void
>
struct
remove_idx
{
static
bool
remove
(
std
::
vector
<
node
*>&
,
const
Key
&
)
{
return
false
;
}
};
template
<
typename
Key
>
struct
remove_idx
<
Key
,
typename
std
::
enable_if
<
std
::
is_unsigned
<
Key
>::
value
&&
!
std
::
is_same
<
Key
,
bool
>::
value
>::
type
>
{
static
bool
remove
(
std
::
vector
<
node
*>&
sequence
,
const
Key
&
key
)
{
if
(
key
>=
sequence
.
size
())
{
return
false
;
}
else
{
sequence
.
erase
(
sequence
.
begin
()
+
key
);
return
true
;
}
}
};
template
<
typename
Key
>
struct
remove_idx
<
Key
,
typename
std
::
enable_if
<
std
::
is_signed
<
Key
>::
value
>::
type
>
{
static
bool
remove
(
std
::
vector
<
node
*>&
sequence
,
const
Key
&
key
)
{
return
key
>=
0
?
remove_idx
<
std
::
size_t
>::
remove
(
sequence
,
static_cast
<
std
::
size_t
>
(
key
))
:
false
;
}
};
template
<
typename
T
>
template
<
typename
T
>
inline
bool
node
::
equals
(
const
T
&
rhs
,
shared_memory_holder
pMemory
)
{
inline
bool
node
::
equals
(
const
T
&
rhs
,
shared_memory_holder
pMemory
)
{
T
lhs
;
T
lhs
;
...
@@ -129,21 +160,23 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
...
@@ -129,21 +160,23 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
template
<
typename
Key
>
template
<
typename
Key
>
inline
bool
node_data
::
remove
(
const
Key
&
key
,
shared_memory_holder
pMemory
)
{
inline
bool
node_data
::
remove
(
const
Key
&
key
,
shared_memory_holder
pMemory
)
{
if
(
m_type
!=
NodeType
::
Map
)
if
(
m_type
==
NodeType
::
Sequence
)
{
return
false
;
return
remove_idx
<
Key
>::
remove
(
m_sequence
,
key
);
}
else
if
(
m_type
==
NodeType
::
Map
)
{
for
(
kv_pairs
::
iterator
it
=
m_undefinedPairs
.
begin
();
kv_pairs
::
iterator
it
=
m_undefinedPairs
.
begin
();
it
!=
m_undefinedPairs
.
end
();)
{
while
(
it
!=
m_undefinedPairs
.
end
())
{
kv_pairs
::
iterator
jt
=
std
::
next
(
it
);
kv_pairs
::
iterator
jt
=
std
::
next
(
it
);
if
(
it
->
first
->
equals
(
key
,
pMemory
))
if
(
it
->
first
->
equals
(
key
,
pMemory
))
{
m_undefinedPairs
.
erase
(
it
);
m_undefinedPairs
.
erase
(
it
);
it
=
jt
;
}
}
it
=
jt
;
}
for
(
node_map
::
iterator
it
=
m_map
.
begin
();
it
!=
m_map
.
end
();
++
it
)
{
for
(
node_map
::
iterator
it
=
m_map
.
begin
();
it
!=
m_map
.
end
();
++
it
)
{
if
(
it
->
first
->
equals
(
key
,
pMemory
))
{
if
(
it
->
first
->
equals
(
key
,
pMemory
))
{
m_map
.
erase
(
it
);
m_map
.
erase
(
it
);
return
true
;
return
true
;
}
}
}
}
}
...
...
src/node_data.cpp
View file @
4fb1c4b9
...
@@ -235,6 +235,14 @@ bool node_data::remove(node& key, shared_memory_holder /* pMemory */) {
...
@@ -235,6 +235,14 @@ bool node_data::remove(node& key, shared_memory_holder /* pMemory */) {
if
(
m_type
!=
NodeType
::
Map
)
if
(
m_type
!=
NodeType
::
Map
)
return
false
;
return
false
;
kv_pairs
::
iterator
it
=
m_undefinedPairs
.
begin
();
while
(
it
!=
m_undefinedPairs
.
end
())
{
kv_pairs
::
iterator
jt
=
std
::
next
(
it
);
if
(
it
->
first
->
is
(
key
))
m_undefinedPairs
.
erase
(
it
);
it
=
jt
;
}
for
(
node_map
::
iterator
it
=
m_map
.
begin
();
it
!=
m_map
.
end
();
++
it
)
{
for
(
node_map
::
iterator
it
=
m_map
.
begin
();
it
!=
m_map
.
end
();
++
it
)
{
if
(
it
->
first
->
is
(
key
))
{
if
(
it
->
first
->
is
(
key
))
{
m_map
.
erase
(
it
);
m_map
.
erase
(
it
);
...
...
test/node/node_test.cpp
View file @
4fb1c4b9
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/emitter.h"
#include "yaml-cpp/emitter.h"
#include "yaml-cpp/node/convert.h"
#include "yaml-cpp/node/detail/impl.h"
#include "yaml-cpp/node/emit.h"
#include "yaml-cpp/node/emit.h"
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/node/convert.h"
#include "yaml-cpp/node/iterator.h"
#include "yaml-cpp/node/iterator.h"
#include "yaml-cpp/node/detail/impl.h"
#include "gmock/gmock.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
#include "gtest/gtest.h"
...
@@ -47,6 +47,30 @@ TEST(NodeTest, SimpleAppendSequence) {
...
@@ -47,6 +47,30 @@ TEST(NodeTest, SimpleAppendSequence) {
EXPECT_TRUE
(
node
.
IsSequence
());
EXPECT_TRUE
(
node
.
IsSequence
());
}
}
TEST
(
NodeTest
,
SequenceElementRemoval
)
{
Node
node
;
node
[
0
]
=
"a"
;
node
[
1
]
=
"b"
;
node
[
2
]
=
"c"
;
node
.
remove
(
1
);
EXPECT_TRUE
(
node
.
IsSequence
());
EXPECT_EQ
(
2
,
node
.
size
());
EXPECT_EQ
(
"a"
,
node
[
0
].
as
<
std
::
string
>
());
EXPECT_EQ
(
"c"
,
node
[
1
].
as
<
std
::
string
>
());
}
TEST
(
NodeTest
,
SequenceLastElementRemoval
)
{
Node
node
;
node
[
0
]
=
"a"
;
node
[
1
]
=
"b"
;
node
[
2
]
=
"c"
;
node
.
remove
(
2
);
EXPECT_TRUE
(
node
.
IsSequence
());
EXPECT_EQ
(
2
,
node
.
size
());
EXPECT_EQ
(
"a"
,
node
[
0
].
as
<
std
::
string
>
());
EXPECT_EQ
(
"b"
,
node
[
1
].
as
<
std
::
string
>
());
}
TEST
(
NodeTest
,
MapElementRemoval
)
{
TEST
(
NodeTest
,
MapElementRemoval
)
{
Node
node
;
Node
node
;
node
[
"foo"
]
=
"bar"
;
node
[
"foo"
]
=
"bar"
;
...
@@ -54,6 +78,16 @@ TEST(NodeTest, MapElementRemoval) {
...
@@ -54,6 +78,16 @@ TEST(NodeTest, MapElementRemoval) {
EXPECT_TRUE
(
!
node
[
"foo"
]);
EXPECT_TRUE
(
!
node
[
"foo"
]);
}
}
TEST
(
NodeTest
,
MapIntegerElementRemoval
)
{
Node
node
;
node
[
1
]
=
"hello"
;
node
[
2
]
=
'c'
;
node
[
"foo"
]
=
"bar"
;
EXPECT_TRUE
(
node
.
IsMap
());
node
.
remove
(
1
);
EXPECT_TRUE
(
node
.
IsMap
());
}
TEST
(
NodeTest
,
SimpleAssignSequence
)
{
TEST
(
NodeTest
,
SimpleAssignSequence
)
{
Node
node
;
Node
node
;
node
[
0
]
=
10
;
node
[
0
]
=
10
;
...
@@ -106,6 +140,14 @@ TEST(NodeTest, RemoveUnassignedNode) {
...
@@ -106,6 +140,14 @@ TEST(NodeTest, RemoveUnassignedNode) {
EXPECT_EQ
(
0
,
node
.
size
());
EXPECT_EQ
(
0
,
node
.
size
());
}
}
TEST
(
NodeTest
,
RemoveUnassignedNodeFromMap
)
{
Node
node
(
NodeType
::
Map
);
Node
n
;
node
[
n
];
node
.
remove
(
n
);
EXPECT_EQ
(
0
,
node
.
size
());
}
TEST
(
NodeTest
,
MapForceInsert
)
{
TEST
(
NodeTest
,
MapForceInsert
)
{
Node
node
;
Node
node
;
Node
k1
(
"k1"
);
Node
k1
(
"k1"
);
...
...
util/CMakeLists.txt
View file @
4fb1c4b9
cmake_minimum_required
(
VERSION 3.5
)
add_sources
(
parse.cpp
)
add_sources
(
parse.cpp
)
add_executable
(
parse parse.cpp
)
add_executable
(
parse parse.cpp
)
target_link_libraries
(
parse yaml-cpp
)
target_link_libraries
(
parse yaml-cpp
)
...
...
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