libimgdoc2
Loading...
Searching...
No Matches
IDocumentMetadata.h
1// SPDX-FileCopyrightText: 2023 Carl Zeiss Microscopy GmbH
2//
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
7#include <cstdint>
8#include <string>
9#include <variant>
10#include <functional>
11#include <limits>
12#include <optional>
13#include <type_traits>
14#include "types.h"
15
16namespace imgdoc2
17{
19 enum class DocumentMetadataType : std::uint8_t
20 {
22 kInvalid = 0,
23
27 kDefault,
28
30 kNull,
31
33 kText,
34
36 kInt32,
37
39 kJson,
40
42 kDouble
43 };
44
47 {
48 public:
50 typedef std::variant<std::string, std::int32_t, double, std::monostate> metadata_item_variant;
51
52 virtual ~IDocumentMetadata() = default;
53
54 // no copy and no move (-> https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c21-if-you-define-or-delete-any-copy-move-or-destructor-function-define-or-delete-them-all )
55 IDocumentMetadata() = default;
56 IDocumentMetadata(const IDocumentMetadata&) = delete; // copy constructor
57 IDocumentMetadata& operator=(const IDocumentMetadata&) = delete; // copy assignment
58 IDocumentMetadata(IDocumentMetadata&&) = delete; // move constructor
59 IDocumentMetadata& operator=(IDocumentMetadata&&) = delete; // move assignment
60 };
61
64 enum class DocumentMetadataItemFlags : std::uint8_t
65 {
66 None = 0,
67 kPrimaryKeyValid = 1,
68 kNameValid = 2,
69 kDocumentMetadataTypeAndValueValid = 4,
70 kCompletePath = 8,
71
72 kAll = kPrimaryKeyValid | kNameValid | kDocumentMetadataTypeAndValueValid,
73 kAllWithCompletePath = kAll | kCompletePath
74 };
75
81 inline constexpr DocumentMetadataItemFlags operator|(DocumentMetadataItemFlags x, DocumentMetadataItemFlags y)
82 {
83 return static_cast<DocumentMetadataItemFlags>(static_cast<std::underlying_type_t<DocumentMetadataItemFlags>>(x) | static_cast<std::underlying_type_t<DocumentMetadataItemFlags>>(y));
84 }
85
91 inline constexpr DocumentMetadataItemFlags operator&(DocumentMetadataItemFlags x, DocumentMetadataItemFlags y)
92 {
93 return static_cast<DocumentMetadataItemFlags>(static_cast<std::underlying_type_t<DocumentMetadataItemFlags>>(x) & static_cast<std::underlying_type_t<DocumentMetadataItemFlags>>(y));
94 }
95
99 inline constexpr DocumentMetadataItemFlags operator~(DocumentMetadataItemFlags x)
100 {
101 return static_cast<DocumentMetadataItemFlags>(~static_cast<std::underlying_type_t<DocumentMetadataItemFlags>>(x));
102 }
103
106 {
107 DocumentMetadataItemFlags flags{ DocumentMetadataItemFlags::None };
108 imgdoc2::dbIndex primary_key{ std::numeric_limits<imgdoc2::dbIndex>::max() };
109 std::string name;
110 std::string complete_path;
111 DocumentMetadataType type{ DocumentMetadataType::kInvalid };
113 };
114
117 {
118 public:
119 ~IDocumentMetadataRead() override = default;
120
129 virtual imgdoc2::DocumentMetadataItem GetItem(imgdoc2::dbIndex primary_key, DocumentMetadataItemFlags flags) = 0;
130
139 virtual imgdoc2::DocumentMetadataItem GetItemForPath(const std::string& path, imgdoc2::DocumentMetadataItemFlags flags) = 0;
140
150 virtual void EnumerateItems(
151 std::optional<imgdoc2::dbIndex> parent,
152 bool recursive,
153 DocumentMetadataItemFlags flags,
154 const std::function<bool(imgdoc2::dbIndex, const DocumentMetadataItem& item)>& func) = 0;
155
166 const std::string& path,
167 bool recursive,
168 DocumentMetadataItemFlags flags,
169 const std::function<bool(imgdoc2::dbIndex, const DocumentMetadataItem& item)>& func) = 0;
170
171 // no copy and no move (-> https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c21-if-you-define-or-delete-any-copy-move-or-destructor-function-define-or-delete-them-all )
172 IDocumentMetadataRead() = default;
173 IDocumentMetadataRead(const IDocumentMetadataRead&) = delete; // copy constructor
174 IDocumentMetadataRead& operator=(const IDocumentMetadataRead&) = delete; // copy assignment
175 IDocumentMetadataRead(IDocumentMetadataRead&&) = delete; // move constructor
176 IDocumentMetadataRead& operator=(IDocumentMetadataRead&&) = delete; // move assignment
177 };
178
181 {
182 public:
183 ~IDocumentMetadataWrite() override = default;
184
198 virtual imgdoc2::dbIndex UpdateOrCreateItem(
199 std::optional<imgdoc2::dbIndex> parent,
200 bool create_node_if_not_exists,
201 const std::string& name,
202 DocumentMetadataType type,
204
217 virtual imgdoc2::dbIndex UpdateOrCreateItemForPath(
218 bool create_path_if_not_exists,
219 bool create_node_if_not_exists,
220 const std::string& path,
221 DocumentMetadataType type,
223
234 virtual std::uint64_t DeleteItem(
235 std::optional<imgdoc2::dbIndex> primary_key,
236 bool recursively) = 0;
237
248 virtual std::uint64_t DeleteItemForPath(
249 const std::string& path,
250 bool recursively) = 0;
251
252 // no copy and no move (-> https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#c21-if-you-define-or-delete-any-copy-move-or-destructor-function-define-or-delete-them-all )
253 IDocumentMetadataWrite() = default;
254 IDocumentMetadataWrite(const IDocumentMetadataWrite&) = delete; // copy constructor
255 IDocumentMetadataWrite& operator=(const IDocumentMetadataWrite&) = delete; // copy assignment
256 IDocumentMetadataWrite(IDocumentMetadataWrite&&) = delete; // move constructor
257 IDocumentMetadataWrite& operator=(IDocumentMetadataWrite&&) = delete; // move assignment
258 };
259}
The interface for read-only access to document metadata.
Definition: IDocumentMetadata.h:117
virtual imgdoc2::DocumentMetadataItem GetItemForPath(const std::string &path, imgdoc2::DocumentMetadataItemFlags flags)=0
virtual void EnumerateItemsForPath(const std::string &path, bool recursive, DocumentMetadataItemFlags flags, const std::function< bool(imgdoc2::dbIndex, const DocumentMetadataItem &item)> &func)=0
virtual imgdoc2::DocumentMetadataItem GetItem(imgdoc2::dbIndex primary_key, DocumentMetadataItemFlags flags)=0
virtual void EnumerateItems(std::optional< imgdoc2::dbIndex > parent, bool recursive, DocumentMetadataItemFlags flags, const std::function< bool(imgdoc2::dbIndex, const DocumentMetadataItem &item)> &func)=0
The interface for write access to document metadata.
Definition: IDocumentMetadata.h:181
virtual imgdoc2::dbIndex UpdateOrCreateItemForPath(bool create_path_if_not_exists, bool create_node_if_not_exists, const std::string &path, DocumentMetadataType type, const IDocumentMetadata::metadata_item_variant &value)=0
virtual std::uint64_t DeleteItemForPath(const std::string &path, bool recursively)=0
virtual imgdoc2::dbIndex UpdateOrCreateItem(std::optional< imgdoc2::dbIndex > parent, bool create_node_if_not_exists, const std::string &name, DocumentMetadataType type, const IDocumentMetadata::metadata_item_variant &value)=0
virtual std::uint64_t DeleteItem(std::optional< imgdoc2::dbIndex > primary_key, bool recursively)=0
Base interface for document metadata.
Definition: IDocumentMetadata.h:47
std::variant< std::string, std::int32_t, double, std::monostate > metadata_item_variant
Defines an alias representing the metadata item variant. This variant can contain a string,...
Definition: IDocumentMetadata.h:50
This structure is used to return information about a document metadata item. The flags field specifie...
Definition: IDocumentMetadata.h:106
DocumentMetadataItemFlags flags
The flags indicating which pieces of information are valid.
Definition: IDocumentMetadata.h:107
IDocumentMetadata::metadata_item_variant value
The value of the metadata item. Check the flags field to see if this is valid.
Definition: IDocumentMetadata.h:112
std::string complete_path
The complete path of the metadata item. Check the flags field to see if this is valid.
Definition: IDocumentMetadata.h:110
std::string name
The name of the metadata item. Check the flags field to see if this is valid.
Definition: IDocumentMetadata.h:109
imgdoc2::dbIndex primary_key
The primary key of the metadata item. Check the flags field to see if this is valid.
Definition: IDocumentMetadata.h:108
DocumentMetadataType type
The type of the metadata item. Check the flags field to see if this is valid.
Definition: IDocumentMetadata.h:111