diff options
Diffstat (limited to 'intl/icu_capi/cpp/include/CodePointRangeIterator.hpp')
-rw-r--r-- | intl/icu_capi/cpp/include/CodePointRangeIterator.hpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/intl/icu_capi/cpp/include/CodePointRangeIterator.hpp b/intl/icu_capi/cpp/include/CodePointRangeIterator.hpp new file mode 100644 index 0000000000..3c2d5caef0 --- /dev/null +++ b/intl/icu_capi/cpp/include/CodePointRangeIterator.hpp @@ -0,0 +1,54 @@ +#ifndef CodePointRangeIterator_HPP +#define CodePointRangeIterator_HPP +#include <stdint.h> +#include <stddef.h> +#include <stdbool.h> +#include <algorithm> +#include <memory> +#include <variant> +#include <optional> +#include "diplomat_runtime.hpp" + +#include "CodePointRangeIterator.h" + +struct CodePointRangeIteratorResult; + +/** + * A destruction policy for using CodePointRangeIterator with std::unique_ptr. + */ +struct CodePointRangeIteratorDeleter { + void operator()(capi::CodePointRangeIterator* l) const noexcept { + capi::CodePointRangeIterator_destroy(l); + } +}; + +/** + * An iterator over code point ranges, produced by `ICU4XCodePointSetData` or + * one of the `ICU4XCodePointMapData` types + */ +class CodePointRangeIterator { + public: + + /** + * Advance the iterator by one and return the next range. + * + * If the iterator is out of items, `done` will be true + */ + CodePointRangeIteratorResult next(); + inline const capi::CodePointRangeIterator* AsFFI() const { return this->inner.get(); } + inline capi::CodePointRangeIterator* AsFFIMut() { return this->inner.get(); } + inline CodePointRangeIterator(capi::CodePointRangeIterator* i) : inner(i) {} + CodePointRangeIterator() = default; + CodePointRangeIterator(CodePointRangeIterator&&) noexcept = default; + CodePointRangeIterator& operator=(CodePointRangeIterator&& other) noexcept = default; + private: + std::unique_ptr<capi::CodePointRangeIterator, CodePointRangeIteratorDeleter> inner; +}; + +#include "CodePointRangeIteratorResult.hpp" + +inline CodePointRangeIteratorResult CodePointRangeIterator::next() { + capi::CodePointRangeIteratorResult diplomat_raw_struct_out_value = capi::CodePointRangeIterator_next(this->inner.get()); + return CodePointRangeIteratorResult{ .start = std::move(diplomat_raw_struct_out_value.start), .end = std::move(diplomat_raw_struct_out_value.end), .done = std::move(diplomat_raw_struct_out_value.done) }; +} +#endif |