Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 0 additions & 27 deletions src/odr/definitions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,10 @@

#include <cstdint>

namespace odr::internal::abstract {
class ElementAdapter;
} // namespace odr::internal::abstract

namespace odr {

using ElementIdentifier = std::uint64_t;

static constexpr ElementIdentifier null_element_id{0};

struct ElementHandle final {
const internal::abstract::ElementAdapter *adapter_ptr{nullptr};
ElementIdentifier identifier{null_element_id};

ElementHandle() = default;
ElementHandle(const internal::abstract::ElementAdapter *adapter_ptr_,
const ElementIdentifier identifier_)
: adapter_ptr(adapter_ptr_), identifier(identifier_) {}
ElementHandle(const internal::abstract::ElementAdapter &adapter_,
const ElementIdentifier identifier_)
: adapter_ptr(&adapter_), identifier(identifier_) {}

[[nodiscard]] const internal::abstract::ElementAdapter &adapter() const {
return *adapter_ptr;
}

[[nodiscard]] bool is_null() const { return identifier == null_element_id; }

bool operator==(const ElementHandle &other) const {
return adapter_ptr == other.adapter_ptr && identifier == other.identifier;
}
};

} // namespace odr
2 changes: 1 addition & 1 deletion src/odr/document.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ DocumentType Document::document_type() const noexcept {
}

Element Document::root_element() const {
return Element(m_impl->root_element());
return {m_impl->element_adapter(), m_impl->root_element()};
}

Filesystem Document::as_filesystem() const {
Expand Down
70 changes: 34 additions & 36 deletions src/odr/document_element.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,6 @@ namespace odr {

Element::Element() = default;

Element::Element(const ElementHandle &handle)
: m_adapter{handle.adapter_ptr}, m_identifier{handle.identifier} {}

Element::Element(const internal::abstract::ElementAdapter *adapter,
const ElementIdentifier identifier)
: m_adapter{adapter}, m_identifier{identifier} {}
Expand All @@ -30,23 +27,26 @@ ElementType Element::type() const {
}

Element Element::parent() const {
return exists_() ? Element(m_adapter->element_parent(m_identifier))
return exists_() ? Element(m_adapter, m_adapter->element_parent(m_identifier))
: Element();
}

Element Element::first_child() const {
return exists_() ? Element(m_adapter->element_first_child(m_identifier))
: Element();
return exists_()
? Element(m_adapter, m_adapter->element_first_child(m_identifier))
: Element();
}

Element Element::previous_sibling() const {
return exists_() ? Element(m_adapter->element_previous_sibling(m_identifier))
return exists_() ? Element(m_adapter,
m_adapter->element_previous_sibling(m_identifier))
: Element();
}

Element Element::next_sibling() const {
return exists_() ? Element(m_adapter->element_next_sibling(m_identifier))
: Element();
return exists_()
? Element(m_adapter, m_adapter->element_next_sibling(m_identifier))
: Element();
}

bool Element::is_unique() const {
Expand All @@ -68,7 +68,8 @@ DocumentPath Element::document_path() const {

Element Element::navigate_path(const DocumentPath &path) const {
return exists_()
? Element(m_adapter->element_navigate_path(m_identifier, path))
? Element(m_adapter,
m_adapter->element_navigate_path(m_identifier, path))
: Element();
}

Expand Down Expand Up @@ -168,17 +169,14 @@ Image Element::as_image() const {
}

ElementRange Element::children() const {
return {exists_()
? ElementIterator(m_adapter->element_first_child(m_identifier))
: ElementIterator(),
return {exists_() ? ElementIterator(m_adapter, m_adapter->element_first_child(
m_identifier))
: ElementIterator(),
ElementIterator()};
}

ElementIterator::ElementIterator() = default;

ElementIterator::ElementIterator(const ElementHandle &handle)
: m_adapter{handle.adapter_ptr}, m_identifier{handle.identifier} {}

ElementIterator::ElementIterator(
const internal::abstract::ElementAdapter *adapter,
const ElementIdentifier identifier)
Expand All @@ -188,10 +186,7 @@ Element ElementIterator::operator*() const { return {m_adapter, m_identifier}; }

ElementIterator &ElementIterator::operator++() {
if (exists_()) {
const auto [next_adapter, next_id] =
m_adapter->element_next_sibling(m_identifier);
m_adapter = next_adapter;
m_identifier = next_id;
m_identifier = m_adapter->element_next_sibling(m_identifier);
}
return *this;
}
Expand All @@ -200,7 +195,7 @@ ElementIterator ElementIterator::operator++(int) const {
if (!exists_()) {
return {};
}
return ElementIterator(m_adapter->element_next_sibling(m_identifier));
return {m_adapter, m_adapter->element_next_sibling(m_identifier)};
}

bool ElementIterator::exists_() const {
Expand Down Expand Up @@ -228,9 +223,9 @@ MasterPage TextRoot::first_master_page() const {
if (!exists_()) {
return {};
}
const auto [master_page_adapter, master_page_id] =
const ElementIdentifier master_page_id =
m_adapter2->text_root_first_master_page(m_identifier);
return {master_page_adapter, master_page_id,
return {m_adapter, master_page_id,
m_adapter->master_page_adapter(master_page_id)};
}

Expand Down Expand Up @@ -272,18 +267,21 @@ SheetCell Sheet::cell(const std::uint32_t column,
if (!exists_()) {
return {};
}
const auto [cell_adapter, cell_id] =
const ElementIdentifier cell_id =
m_adapter2->sheet_cell(m_identifier, column, row);
return {cell_adapter, cell_id, m_adapter->sheet_cell_adapter(cell_id)};
if (cell_id == null_element_id) {
return {};
}
return {m_adapter, cell_id, m_adapter->sheet_cell_adapter(cell_id)};
}

ElementRange Sheet::shapes() const {
if (!exists_()) {
return {};
}
const auto [first_shape_adapter, first_shape_id] =
const ElementIdentifier first_shape_id =
m_adapter2->sheet_first_shape(m_identifier);
return ElementRange(ElementIterator(first_shape_adapter, first_shape_id));
return ElementRange(ElementIterator(m_adapter, first_shape_id));
}

TableStyle Sheet::style() const {
Expand Down Expand Up @@ -397,29 +395,29 @@ TableRow Table::first_row() const {
if (!exists_()) {
return {};
}
const auto [row_adapter, row_id] = m_adapter2->table_first_row(m_identifier);
return {row_adapter, row_id, m_adapter->table_row_adapter(row_id)};
const ElementIdentifier row_id = m_adapter2->table_first_row(m_identifier);
return {m_adapter, row_id, m_adapter->table_row_adapter(row_id)};
}

TableColumn Table::first_column() const {
if (!exists_()) {
return {};
}
const auto [column_adapter, column_id] =
const ElementIdentifier column_id =
m_adapter2->table_first_column(m_identifier);
return {column_adapter, column_id,
m_adapter->table_column_adapter(column_id)};
return {m_adapter, column_id, m_adapter->table_column_adapter(column_id)};
}

ElementRange Table::columns() const {
return exists_() ? ElementRange(ElementIterator(
m_adapter2->table_first_column(m_identifier)))
: ElementRange();
return exists_()
? ElementRange(ElementIterator(
m_adapter, m_adapter2->table_first_column(m_identifier)))
: ElementRange();
}

ElementRange Table::rows() const {
return exists_() ? ElementRange(ElementIterator(
m_adapter2->table_first_row(m_identifier)))
m_adapter, m_adapter2->table_first_row(m_identifier)))
: ElementRange();
}

Expand Down
4 changes: 0 additions & 4 deletions src/odr/document_element.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,6 @@ enum class ValueType {
class Element {
public:
Element();
explicit Element(const ElementHandle &handle);
Element(const internal::abstract::ElementAdapter *adapter,
ElementIdentifier identifier);

Expand Down Expand Up @@ -208,7 +207,6 @@ class ElementIterator {
using iterator_category = std::forward_iterator_tag;

ElementIterator();
explicit ElementIterator(const ElementHandle &handle);
ElementIterator(const internal::abstract::ElementAdapter *adapter,
ElementIdentifier identifier);

Expand Down Expand Up @@ -248,8 +246,6 @@ class ElementRange {
template <typename T> class ElementBase : public Element {
public:
ElementBase() = default;
ElementBase(const ElementHandle &handle, const T *adapter2)
: Element(handle), m_adapter2{adapter2} {}
ElementBase(const internal::abstract::ElementAdapter *adapter,
ElementIdentifier identifier, const T *adapter2)
: Element(adapter, identifier), m_adapter2{adapter2} {}
Expand Down
3 changes: 1 addition & 2 deletions src/odr/file.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,8 +74,7 @@ std::vector<FileType> DecodedFile::list_file_types(const std::string &path,
}

std::string_view DecodedFile::mimetype(const std::string &path,
Logger &logger) {
(void)logger;
[[maybe_unused]] Logger &logger) {
return internal::magic::mimetype(path);
}

Expand Down
Loading