1+ /*
2+ * Copyright (c) 2019 - 2025 Geode-solutions
3+ *
4+ * Permission is hereby granted, free of charge, to any person obtaining a copy
5+ * of this software and associated documentation files (the "Software"), to deal
6+ * in the Software without restriction, including without limitation the rights
7+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8+ * copies of the Software, and to permit persons to whom the Software is
9+ * furnished to do so, subject to the following conditions:
10+ *
11+ * The above copyright notice and this permission notice shall be included in
12+ * all copies or substantial portions of the Software.
13+ *
14+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
20+ * SOFTWARE.
21+ *
22+ */
23+
24+ #include < geode/basic/chronometer.hpp>
25+
26+ #include < absl/time/clock.h>
27+
28+ #include < geode/basic/pimpl_impl.hpp>
29+
30+ namespace geode
31+ {
32+ class Chronometer ::Impl
33+ {
34+ public:
35+ void start ()
36+ {
37+ start_time_ = absl::Now ();
38+ }
39+
40+ void stop ()
41+ {
42+ duration_ += absl::Now () - start_time_;
43+ }
44+
45+ [[nodiscard]] absl::Duration raw_duration () const
46+ {
47+ return duration_;
48+ }
49+
50+ [[nodiscard]] std::string duration () const
51+ {
52+ return absl::FormatDuration ( raw_duration () );
53+ }
54+
55+ void reset ()
56+ {
57+ duration_ = absl::ZeroDuration ();
58+ }
59+
60+ private:
61+ absl::Time start_time_;
62+ absl::Duration duration_;
63+ };
64+
65+ Chronometer::Chronometer () = default ;
66+ Chronometer::Chronometer ( Chronometer&& other ) noexcept = default ;
67+ Chronometer::~Chronometer () = default ;
68+
69+ void Chronometer::start ()
70+ {
71+ impl_->start ();
72+ }
73+
74+ void Chronometer::stop ()
75+ {
76+ impl_->stop ();
77+ }
78+
79+ [[nodiscard]] absl::Duration Chronometer::raw_duration () const
80+ {
81+ return impl_->raw_duration ();
82+ }
83+
84+ [[nodiscard]] std::string Chronometer::duration () const
85+ {
86+ return impl_->duration ();
87+ }
88+
89+ void Chronometer::reset ()
90+ {
91+ impl_->reset ();
92+ }
93+ } // namespace geode
0 commit comments