Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yaml-cpp
Overview
Overview
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
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
yaml-cpp
Commits
4fb1c4b9
Commit
4fb1c4b9
authored
May 14, 2018
by
Jiao
Committed by
Jesse Beder
May 14, 2018
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Enable items to be removed from a sequence (#582)
parent
ab5f9259
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
104 additions
and
18 deletions
+104
-18
.gitignore
+1
-0
include/yaml-cpp/node/detail/impl.h
+48
-15
src/node_data.cpp
+8
-0
test/node/node_test.cpp
+45
-3
util/CMakeLists.txt
+2
-0
No files found.
.gitignore
View file @
4fb1c4b9
build/
/tags
include/yaml-cpp/node/detail/impl.h
View file @
4fb1c4b9
...
...
@@ -32,7 +32,7 @@ struct get_idx<Key,
static
node
*
get
(
std
::
vector
<
node
*>&
sequence
,
const
Key
&
key
,
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
;
if
(
key
==
sequence
.
size
())
sequence
.
push_back
(
&
pMemory
->
create_node
());
...
...
@@ -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
>
inline
bool
node
::
equals
(
const
T
&
rhs
,
shared_memory_holder
pMemory
)
{
T
lhs
;
...
...
@@ -129,21 +160,23 @@ inline node& node_data::get(const Key& key, shared_memory_holder pMemory) {
template
<
typename
Key
>
inline
bool
node_data
::
remove
(
const
Key
&
key
,
shared_memory_holder
pMemory
)
{
if
(
m_type
!=
NodeType
::
Map
)
return
false
;
for
(
kv_pairs
::
iterator
it
=
m_undefinedPairs
.
begin
();
it
!=
m_undefinedPairs
.
end
();)
{
kv_pairs
::
iterator
jt
=
std
::
next
(
it
);
if
(
it
->
first
->
equals
(
key
,
pMemory
))
m_undefinedPairs
.
erase
(
it
);
it
=
jt
;
}
if
(
m_type
==
NodeType
::
Sequence
)
{
return
remove_idx
<
Key
>::
remove
(
m_sequence
,
key
);
}
else
if
(
m_type
==
NodeType
::
Map
)
{
kv_pairs
::
iterator
it
=
m_undefinedPairs
.
begin
();
while
(
it
!=
m_undefinedPairs
.
end
())
{
kv_pairs
::
iterator
jt
=
std
::
next
(
it
);
if
(
it
->
first
->
equals
(
key
,
pMemory
))
{
m_undefinedPairs
.
erase
(
it
);
}
it
=
jt
;
}
for
(
node_map
::
iterator
it
=
m_map
.
begin
();
it
!=
m_map
.
end
();
++
it
)
{
if
(
it
->
first
->
equals
(
key
,
pMemory
))
{
m_map
.
erase
(
it
);
return
true
;
for
(
node_map
::
iterator
it
=
m_map
.
begin
();
it
!=
m_map
.
end
();
++
it
)
{
if
(
it
->
first
->
equals
(
key
,
pMemory
))
{
m_map
.
erase
(
it
);
return
true
;
}
}
}
...
...
src/node_data.cpp
View file @
4fb1c4b9
...
...
@@ -235,6 +235,14 @@ bool node_data::remove(node& key, shared_memory_holder /* pMemory */) {
if
(
m_type
!=
NodeType
::
Map
)
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
)
{
if
(
it
->
first
->
is
(
key
))
{
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/node/convert.h"
#include "yaml-cpp/node/detail/impl.h"
#include "yaml-cpp/node/emit.h"
#include "yaml-cpp/node/node.h"
#include "yaml-cpp/node/impl.h"
#include "yaml-cpp/node/convert.h"
#include "yaml-cpp/node/iterator.h"
#include "yaml-cpp/node/detail/impl.h"
#include "gmock/gmock.h"
#include "gtest/gtest.h"
...
...
@@ -47,6 +47,30 @@ TEST(NodeTest, SimpleAppendSequence) {
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
)
{
Node
node
;
node
[
"foo"
]
=
"bar"
;
...
...
@@ -54,6 +78,16 @@ TEST(NodeTest, MapElementRemoval) {
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
)
{
Node
node
;
node
[
0
]
=
10
;
...
...
@@ -106,6 +140,14 @@ TEST(NodeTest, RemoveUnassignedNode) {
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
)
{
Node
node
;
Node
k1
(
"k1"
);
...
...
util/CMakeLists.txt
View file @
4fb1c4b9
cmake_minimum_required
(
VERSION 3.5
)
add_sources
(
parse.cpp
)
add_executable
(
parse parse.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