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
b1730ea3
"docs/source/vscode:/vscode.git/clone" did not exist on "bec7b2dc26c332563e9c0e53474a47c6c69b2a96"
Commit
b1730ea3
authored
Sep 10, 2011
by
Jesse Beder
Browse files
Finished the main iterator stuff, now have to hook it to the nodes/values
parent
3865d37b
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
60 additions
and
51 deletions
+60
-51
include/yaml-cpp/value/detail/iterator.h
include/yaml-cpp/value/detail/iterator.h
+17
-5
include/yaml-cpp/value/detail/iterator_fwd.h
include/yaml-cpp/value/detail/iterator_fwd.h
+6
-16
include/yaml-cpp/value/detail/node_iterator.h
include/yaml-cpp/value/detail/node_iterator.h
+37
-30
No files found.
include/yaml-cpp/value/detail/iterator.h
View file @
b1730ea3
...
@@ -16,24 +16,27 @@ namespace YAML
...
@@ -16,24 +16,27 @@ namespace YAML
{
{
namespace
detail
namespace
detail
{
{
template
<
typename
V
>
struct
iterator_value
;
struct
iterator_value
;
template
<
typename
V
>
template
<
typename
V
>
class
iterator_base
:
public
boost
::
iterator_adaptor
<
class
iterator_base
:
public
boost
::
iterator_adaptor
<
iterator_base
<
V
>
,
iterator_base
<
V
>
,
node_iterator
_base
<
V
,
typename
node_iterator
<
V
>::
seq
,
typename
node_iterator
<
V
>::
map
>
,
node_iterator
,
iterator_value
<
V
>
,
V
,
std
::
bidirectional_iterator_tag
>
std
::
bidirectional_iterator_tag
>
{
{
private:
private:
template
<
typename
W
>
friend
class
iterator_base
<
W
>
;
template
<
typename
>
friend
class
iterator_base
;
struct
enabler
{};
typedef
typename
iterator_base
::
iterator_adaptor_
::
base_type
base_type
;
typedef
typename
iterator_base
::
iterator_adaptor_
::
value_type
value_type
;
public:
public:
iterator_base
()
{}
iterator_base
()
{}
explicit
iterator_base
(
base_type
rhs
,
shared_memory_holder
pMemory
)
:
iterator_base
::
iterator_adaptor_
(
rhs
),
m_pMemory
(
pMemory
)
{}
explicit
iterator_base
(
base_type
rhs
,
shared_memory_holder
pMemory
)
:
iterator_base
::
iterator_adaptor_
(
rhs
),
m_pMemory
(
pMemory
)
{}
template
<
class
W
>
template
<
class
W
>
iterator_base
(
const
iterator_
B
ase
<
W
>&
rhs
,
typename
boost
::
enable_if
<
boost
::
is_convertible
<
W
*
,
V
*>
,
enabler
>::
type
=
enabler
())
:
iterator_
B
ase
::
iterator_adaptor_
(
rhs
.
base
()),
m_pMemory
(
rhs
.
m_pMemory
)
{}
iterator_base
(
const
iterator_
b
ase
<
W
>&
rhs
,
typename
boost
::
enable_if
<
boost
::
is_convertible
<
W
*
,
V
*>
,
enabler
>::
type
=
enabler
())
:
iterator_
b
ase
::
iterator_adaptor_
(
rhs
.
base
()),
m_pMemory
(
rhs
.
m_pMemory
)
{}
private:
private:
friend
class
boost
::
iterator_core_access
;
friend
class
boost
::
iterator_core_access
;
...
@@ -41,6 +44,15 @@ namespace YAML
...
@@ -41,6 +44,15 @@ namespace YAML
void
increment
()
{
this
->
base_reference
()
=
this
->
base
()
->
next
();
}
void
increment
()
{
this
->
base_reference
()
=
this
->
base
()
->
next
();
}
void
decrement
()
{
this
->
base_reference
()
=
this
->
base
()
->
previous
();
}
void
decrement
()
{
this
->
base_reference
()
=
this
->
base
()
->
previous
();
}
value_type
dereference
()
{
const
typename
base_type
::
value_type
&
v
=
*
this
->
base
();
if
(
v
.
pNode
)
return
value_type
(
Value
(
*
v
.
pNode
,
m_pMemory
));
if
(
v
.
pKey
&&
v
.
pValue
)
return
value_type
(
Value
(
*
v
.
pKey
,
m_pMemory
),
Value
(
*
v
.
pValue
,
m_pMemory
));
return
value_type
();
}
private:
private:
shared_memory_holder
m_pMemory
;
shared_memory_holder
m_pMemory
;
};
};
...
...
include/yaml-cpp/value/detail/iterator_fwd.h
View file @
b1730ea3
...
@@ -16,22 +16,12 @@ namespace YAML
...
@@ -16,22 +16,12 @@ namespace YAML
class
node
;
class
node
;
namespace
detail
{
namespace
detail
{
struct
iterator_value
;
class
iterator_value
;
typedef
std
::
vector
<
node
*>
node_seq
;
template
<
typename
V
>
class
iterator_base
;
typedef
std
::
pair
<
node
*
,
node
*>
kv_pair
;
typedef
std
::
list
<
kv_pair
>
node_map
;
typedef
node_seq
::
iterator
node_seq_iterator
;
typedef
node_seq
::
const_iterator
node_seq_const_iterator
;
typedef
node_map
::
iterator
node_map_iterator
;
typedef
node_map
::
const_iterator
node_map_const_iterator
;
template
<
typename
V
,
typename
SeqIter
,
typename
MapIter
>
class
iterator_base
;
}
}
typedef
detail
::
iterator_base
<
detail
::
iterator_value
,
detail
::
node_seq_iterator
,
detail
::
node_map_iterator
>
iterator
;
typedef
detail
::
iterator_base
<
detail
::
iterator_value
>
iterator
;
typedef
detail
::
iterator_base
<
const
detail
::
iterator_value
,
detail
::
node_seq_const_iterator
,
detail
::
node_map_const_iterator
>
const_iterator
;
typedef
detail
::
iterator_base
<
const
detail
::
iterator_value
>
const_iterator
;
}
}
#endif // VALUE_DETAIL_ITERATOR_FWD_H_62B23520_7C8E_11DE_8A39_0800200C9A66
#endif // VALUE_DETAIL_ITERATOR_FWD_H_62B23520_7C8E_11DE_8A39_0800200C9A66
include/yaml-cpp/value/detail/node_iterator.h
View file @
b1730ea3
...
@@ -22,37 +22,60 @@ namespace YAML
...
@@ -22,37 +22,60 @@ namespace YAML
template
<
typename
V
>
template
<
typename
V
>
struct
node_iterator_value
{
struct
node_iterator_value
{
iterator_value
()
:
pNode
(
0
),
pKey
(
0
),
pValue
(
0
)
{}
node_
iterator_value
()
:
pNode
(
0
),
pKey
(
0
),
pValue
(
0
)
{}
explicit
iterator_value
(
V
&
rhs
)
:
pNode
(
&
rhs
),
pKey
(
0
),
pValue
(
0
)
{}
explicit
node_
iterator_value
(
V
&
rhs
)
:
pNode
(
&
rhs
),
pKey
(
0
),
pValue
(
0
)
{}
explicit
iterator_value
(
V
&
key
,
V
&
value
)
:
pNode
(
0
),
pKey
(
&
key
),
pValue
(
&
value
)
{}
explicit
node_
iterator_value
(
V
&
key
,
V
&
value
)
:
pNode
(
0
),
pKey
(
&
key
),
pValue
(
&
value
)
{}
V
*
pNode
;
V
*
pNode
;
V
*
pKey
,
*
pValue
;
V
*
pKey
,
*
pValue
;
};
};
template
<
typename
V
,
typename
SeqIter
,
typename
MapIter
>
typedef
std
::
vector
<
node
*>
node_seq
;
class
node_iterator_base
:
public
boost
::
iterator_facade
<
node_iterator_base
<
V
,
SeqIter
,
MapIter
>
,
node_iterator_value
<
V
>
,
std
::
bidirectional_iterator_tag
>
typedef
std
::
pair
<
node
*
,
node
*>
kv_pair
;
typedef
std
::
list
<
kv_pair
>
node_map
;
template
<
typename
V
>
struct
node_iterator_type
{
typedef
node_seq
::
iterator
seq
;
typedef
node_map
::
iterator
map
;
};
template
<
typename
V
>
struct
node_iterator_type
<
const
V
>
{
typedef
node_seq
::
const_iterator
seq
;
typedef
node_map
::
const_iterator
map
;
};
template
<
typename
V
>
class
node_iterator_base
:
public
boost
::
iterator_facade
<
node_iterator_base
<
V
>
,
node_iterator_value
<
V
>
,
std
::
bidirectional_iterator_tag
,
node_iterator_value
<
V
>
>
{
{
private:
private:
struct
enabler
{};
struct
enabler
{};
public:
public:
typedef
typename
node_iterator_type
<
V
>::
seq
SeqIter
;
typedef
typename
node_iterator_type
<
V
>::
map
MapIter
;
typedef
node_iterator_value
<
V
>
value_type
;
typedef
node_iterator_value
<
V
>
value_type
;
iterator_base
()
:
m_type
(
iterator_type
::
None
)
{}
node_
iterator_base
()
:
m_type
(
iterator_type
::
None
)
{}
explicit
node_iterator_base
(
SeqIter
seqIt
)
:
m_type
(
iterator_type
::
Sequence
),
m_seqIt
(
seqIt
)
{}
explicit
node_iterator_base
(
SeqIter
seqIt
)
:
m_type
(
iterator_type
::
Sequence
),
m_seqIt
(
seqIt
)
{}
explicit
node_iterator_base
(
MapIter
mapIt
)
:
m_type
(
iterator_type
::
Map
),
m_mapIt
(
mapIt
)
{}
explicit
node_iterator_base
(
MapIter
mapIt
)
:
m_type
(
iterator_type
::
Map
),
m_mapIt
(
mapIt
)
{}
template
<
typename
W
,
typename
I
,
typename
J
>
template
<
typename
W
>
node_iterator_base
(
const
node_iterator_base
<
W
,
I
,
J
>&
rhs
,
typename
boost
::
enable_if
<
boost
::
is_convertible
<
W
*
,
V
*>
,
enabler
>::
type
=
enabler
())
node_iterator_base
(
const
node_iterator_base
<
W
>&
rhs
,
typename
boost
::
enable_if
<
boost
::
is_convertible
<
W
*
,
V
*>
,
enabler
>::
type
=
enabler
())
:
m_type
(
rhs
.
m_type
),
m_seqIt
(
rhs
.
m_seqIt
),
m_mapIt
(
rhs
.
m_mapIt
)
{}
:
m_type
(
rhs
.
m_type
),
m_seqIt
(
rhs
.
m_seqIt
),
m_mapIt
(
rhs
.
m_mapIt
)
{}
private:
private:
friend
class
boost
::
iterator_core_access
;
friend
class
boost
::
iterator_core_access
;
template
<
typename
,
typename
,
typename
>
friend
class
node_iterator_base
;
template
<
typename
>
friend
class
node_iterator_base
;
template
<
typename
W
,
typename
I
,
typename
J
>
template
<
typename
W
>
bool
equal
(
const
node_iterator_base
<
W
,
I
,
J
>&
rhs
)
const
{
bool
equal
(
const
node_iterator_base
<
W
>&
rhs
)
const
{
if
(
m_type
!=
rhs
.
m_type
)
if
(
m_type
!=
rhs
.
m_type
)
return
false
;
return
false
;
...
@@ -83,7 +106,7 @@ namespace YAML
...
@@ -83,7 +106,7 @@ namespace YAML
value_type
dereference
()
const
{
value_type
dereference
()
const
{
switch
(
m_type
)
{
switch
(
m_type
)
{
case
iterator_type
::
None
:
return
value_type
();
case
iterator_type
::
None
:
return
value_type
();
case
iterator_type
::
Sequence
:
return
value_type
(
**
m_seqIt
)
)
;
case
iterator_type
::
Sequence
:
return
value_type
(
**
m_seqIt
);
case
iterator_type
::
Map
:
return
value_type
(
*
m_mapIt
->
first
,
*
m_mapIt
->
second
);
case
iterator_type
::
Map
:
return
value_type
(
*
m_mapIt
->
first
,
*
m_mapIt
->
second
);
}
}
return
V
();
return
V
();
...
@@ -96,24 +119,8 @@ namespace YAML
...
@@ -96,24 +119,8 @@ namespace YAML
MapIter
m_mapIt
;
MapIter
m_mapIt
;
};
};
typedef
std
::
vector
<
node
*>
node_seq
;
typedef
node_iterator_base
<
node
>
node_iterator
;
typedef
std
::
pair
<
node
*
,
node
*>
kv_pair
;
typedef
node_iterator_base
<
const
node
>
const_node_iterator
;
typedef
std
::
list
<
kv_pair
>
node_map
;
template
<
typename
V
>
struct
node_iterator
{
typedef
node_seq
::
iterator
seq
;
typedef
node_map
::
iterator
map
;
};
template
<
typename
V
>
struct
node_iterator
<
const
V
>
{
typedef
node_seq
::
const_iterator
seq
;
typedef
node_map
::
const_iterator
map
;
};
typedef
node_iterator_base
<
node
,
detail
::
node_seq_iterator
,
node_map_iterator
>
node_iterator
;
typedef
node_iterator_base
<
const
node
,
node_seq_const_iterator
,
node_map_const_iterator
>
const_node_iterator
;
}
}
}
}
...
...
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