11#include < odr/document_element.hpp>
22
3+ #include < odr/document_path.hpp>
34#include < odr/file.hpp>
45#include < odr/style.hpp>
56#include < odr/table_dimension.hpp>
67#include < odr/table_position.hpp>
78
8- #include < odr/internal/abstract/document_element .hpp>
9+ #include < odr/internal/abstract/document .hpp>
910
1011namespace odr {
1112
1213Element::Element () = default ;
1314
15+ Element::Element (const ElementHandle &handle)
16+ : m_adapter{handle.adapter_ptr }, m_identifier{handle.identifier } {}
17+
1418Element::Element (const internal::abstract::ElementAdapter *adapter,
1519 const ElementIdentifier identifier)
1620 : m_adapter{adapter}, m_identifier{identifier} {}
@@ -26,32 +30,48 @@ ElementType Element::type() const {
2630}
2731
2832Element Element::parent () const {
29- return exists_ () ? Element (m_adapter, m_adapter ->element_parent (m_identifier))
33+ return exists_ () ? Element (m_adapter->element_parent (m_identifier))
3034 : Element ();
3135}
3236
3337Element Element::first_child () const {
34- return exists_ ()
35- ? Element (m_adapter, m_adapter->element_first_child (m_identifier))
36- : Element ();
38+ return exists_ () ? Element (m_adapter->element_first_child (m_identifier))
39+ : Element ();
3740}
3841
3942Element Element::previous_sibling () const {
40- return exists_ () ? Element (m_adapter,
41- m_adapter->element_previous_sibling (m_identifier))
43+ return exists_ () ? Element (m_adapter->element_previous_sibling (m_identifier))
4244 : Element ();
4345}
4446
4547Element Element::next_sibling () const {
46- return exists_ ()
47- ? Element (m_adapter, m_adapter->element_next_sibling (m_identifier))
48- : Element ();
48+ return exists_ () ? Element (m_adapter->element_next_sibling (m_identifier))
49+ : Element ();
50+ }
51+
52+ bool Element::is_unique () const {
53+ return exists_ () ? m_adapter->element_is_unique (m_identifier) : false ;
54+ }
55+
56+ bool Element::is_self_locatable () const {
57+ return exists_ () ? m_adapter->element_is_self_locatable (m_identifier) : false ;
4958}
5059
5160bool Element::is_editable () const {
5261 return exists_ () ? m_adapter->element_is_editable (m_identifier) : false ;
5362}
5463
64+ DocumentPath Element::document_path () const {
65+ return exists_ () ? m_adapter->element_document_path (m_identifier)
66+ : DocumentPath ();
67+ }
68+
69+ Element Element::navigate_path (const DocumentPath &path) const {
70+ return exists_ ()
71+ ? Element (m_adapter->element_navigate_path (m_identifier, path))
72+ : Element ();
73+ }
74+
5575TextRoot Element::as_text_root () const {
5676 return {m_adapter, m_identifier, m_adapter->text_root_adapter (m_identifier)};
5777}
@@ -148,35 +168,39 @@ Image Element::as_image() const {
148168}
149169
150170ElementRange Element::children () const {
151- return {exists_ () ? ElementIterator (m_adapter, m_adapter-> element_first_child (
152- m_identifier))
153- : ElementIterator (),
171+ return {exists_ ()
172+ ? ElementIterator (m_adapter-> element_first_child ( m_identifier))
173+ : ElementIterator (),
154174 ElementIterator ()};
155175}
156176
157177ElementIterator::ElementIterator () = default ;
158178
179+ ElementIterator::ElementIterator (const ElementHandle &handle)
180+ : m_adapter{handle.adapter_ptr }, m_identifier{handle.identifier } {}
181+
159182ElementIterator::ElementIterator (
160183 const internal::abstract::ElementAdapter *adapter,
161184 const ElementIdentifier identifier)
162185 : m_adapter{adapter}, m_identifier{identifier} {}
163186
164- ElementIterator::reference ElementIterator::operator *() const {
165- return {m_adapter, m_identifier};
166- }
187+ Element ElementIterator::operator *() const { return {m_adapter, m_identifier}; }
167188
168189ElementIterator &ElementIterator::operator ++() {
169190 if (exists_ ()) {
170- m_identifier = m_adapter->element_next_sibling (m_identifier);
191+ const auto [next_adapter, next_id] =
192+ m_adapter->element_next_sibling (m_identifier);
193+ m_adapter = next_adapter;
194+ m_identifier = next_id;
171195 }
172196 return *this ;
173197}
174198
175- ElementIterator ElementIterator::operator ++(int ) {
199+ ElementIterator ElementIterator::operator ++(int ) const {
176200 if (!exists_ ()) {
177201 return {};
178202 }
179- return { m_adapter, m_adapter ->element_next_sibling (m_identifier)} ;
203+ return ElementIterator ( m_adapter->element_next_sibling (m_identifier)) ;
180204}
181205
182206bool ElementIterator::exists_ () const {
@@ -204,9 +228,9 @@ MasterPage TextRoot::first_master_page() const {
204228 if (!exists_ ()) {
205229 return {};
206230 }
207- const ElementIdentifier master_page_id =
231+ const auto [master_page_adapter, master_page_id] =
208232 m_adapter2->text_root_first_master_page (m_identifier);
209- return {m_adapter , master_page_id,
233+ return {master_page_adapter , master_page_id,
210234 m_adapter->master_page_adapter (master_page_id)};
211235}
212236
@@ -248,18 +272,18 @@ SheetCell Sheet::cell(const std::uint32_t column,
248272 if (!exists_ ()) {
249273 return {};
250274 }
251- const ElementIdentifier cell_id =
275+ const auto [cell_adapter, cell_id] =
252276 m_adapter2->sheet_cell (m_identifier, column, row);
253- return {m_adapter , cell_id, m_adapter->sheet_cell_adapter (cell_id)};
277+ return {cell_adapter , cell_id, m_adapter->sheet_cell_adapter (cell_id)};
254278}
255279
256280ElementRange Sheet::shapes () const {
257281 if (!exists_ ()) {
258282 return {};
259283 }
260- const ElementIdentifier first_shape_id =
284+ const auto [first_shape_adapter, first_shape_id] =
261285 m_adapter2->sheet_first_shape (m_identifier);
262- return ElementRange (ElementIterator (m_adapter , first_shape_id));
286+ return ElementRange (ElementIterator (first_shape_adapter , first_shape_id));
263287}
264288
265289TableStyle Sheet::style () const {
@@ -373,29 +397,29 @@ TableRow Table::first_row() const {
373397 if (!exists_ ()) {
374398 return {};
375399 }
376- const ElementIdentifier row_id = m_adapter2->table_first_row (m_identifier);
377- return {m_adapter , row_id, m_adapter->table_row_adapter (row_id)};
400+ const auto [row_adapter, row_id] = m_adapter2->table_first_row (m_identifier);
401+ return {row_adapter , row_id, m_adapter->table_row_adapter (row_id)};
378402}
379403
380404TableColumn Table::first_column () const {
381405 if (!exists_ ()) {
382406 return {};
383407 }
384- const ElementIdentifier column_id =
408+ const auto [column_adapter, column_id] =
385409 m_adapter2->table_first_column (m_identifier);
386- return {m_adapter, column_id, m_adapter->table_column_adapter (column_id)};
410+ return {column_adapter, column_id,
411+ m_adapter->table_column_adapter (column_id)};
387412}
388413
389414ElementRange Table::columns () const {
390- return exists_ ()
391- ? ElementRange (ElementIterator (
392- m_adapter, m_adapter2->table_first_column (m_identifier)))
393- : ElementRange ();
415+ return exists_ () ? ElementRange (ElementIterator (
416+ m_adapter2->table_first_column (m_identifier)))
417+ : ElementRange ();
394418}
395419
396420ElementRange Table::rows () const {
397421 return exists_ () ? ElementRange (ElementIterator (
398- m_adapter, m_adapter2->table_first_row (m_identifier)))
422+ m_adapter2->table_first_row (m_identifier)))
399423 : ElementRange ();
400424}
401425
0 commit comments