ReUseX  0.0.5
3D Point Cloud Processing for Building Reuse
Loading...
Searching...
No Matches
processing_observer.hpp
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2025 Povl Filip Sonne-Frederiksen
2//
3// SPDX-License-Identifier: GPL-3.0-or-later
4
5#pragma once
6
7// PCL-free core observer interface (STANDARDS §1: core/ must not pull PCL).
8// The progress-reporting interface lives here; the PCL/Eigen-typed
9// visualization payloads live in core/visual_observer.hpp, which core headers
10// never include. The visual-observer registry below only traffics in an opaque
11// IVisualObserver* (forward-declared), so this header stays PCL-free.
12
13#include "reusex/core/stages.hpp"
14
15#include <cstddef>
16
17namespace reusex::core {
18
19// Forward declaration: the full definition (with PCL/Eigen payloads) lives in
20// core/visual_observer.hpp. Consumers that emit visualization events include
21// that header; the registry here only stores/returns the pointer.
22class IVisualObserver;
23
30
31class IObserver {};
32
34
47 public:
48 explicit ProgressObserver(Stage stage, size_t total = 0);
50
53
54 void update(size_t progress = 1);
55
56 inline void operator++() { update(1); };
57 inline void operator+=(size_t increment) { update(increment); };
58
59 private:
60 Stage stage_;
61 size_t total_ = 0;
62 IProgressObserver *observer_ = nullptr;
63};
64
66 public:
67 virtual ~IProgressObserver() = default;
68
69 // Progress bar callbacks
70 virtual void on_process_started(Stage, size_t) {}
71 virtual void on_process_finished(Stage) {}
72 virtual void on_process_updated(Stage, size_t) {}
73};
74
75// Register a global processing observer. The caller retains ownership and must
76// keep the observer alive until reset or replacement. Passing nullptr clears
77// it.
78//
79// The global observer is the fallback for a thread with no
80// ScopedProgressObserver installed — the rux CLI's progress bar. A server that
81// runs several stages at once (ruxd's job scheduler) must not use it: it would
82// interleave every job's progress into one observer. It installs a
83// ScopedProgressObserver per job instead.
84
87
90
93
98
109 public:
112
115
116 private:
117 IProgressObserver *previous_ = nullptr;
118 bool previous_set_ = false;
119};
120
121} // namespace reusex::core
virtual void on_process_started(Stage, size_t)
virtual void on_process_updated(Stage, size_t)
virtual ~IProgressObserver()=default
ProgressObserver(Stage stage, size_t total=0)
ProgressObserver & operator=(const ProgressObserver &)=delete
void update(size_t progress=1)
ProgressObserver(const ProgressObserver &)=delete
ScopedProgressObserver & operator=(const ScopedProgressObserver &)=delete
ScopedProgressObserver(const ScopedProgressObserver &)=delete
ScopedProgressObserver(IProgressObserver *observer)
Wire form of one stored report PDF version — the ReportPdfVersion schema in ruxd's API contract (docs...
void reset_visual_observer()
auto current_progress_observer() -> IProgressObserver *
The observer progress reported from THIS thread goes to: the innermost ScopedProgressObserver install...
void set_visual_observer(IVisualObserver *observer)
auto get_visual_observer() -> IVisualObserver *
void reset_progress_observer()
auto get_progress_observer() -> IProgressObserver *
void set_progress_observer(IProgressObserver *observer)