25#include <libcamera/base/private.h>
31#define O_TMPFILE (020000000 | O_DIRECTORY)
42 using Ts::operator()...;
49const char *
basename(
const char *path);
52std::string
dirname(
const std::string &path);
55std::vector<typename T::key_type>
map_keys(
const T &map)
57 std::vector<typename T::key_type> keys;
58 std::transform(map.begin(), map.end(), std::back_inserter(keys),
59 [](
const auto &value) { return value.first; });
63template<
class InputIt1,
class InputIt2>
65 InputIt2 first2, InputIt2 last2)
67 unsigned int count = 0;
69 while (first1 != last1 && first2 != last2) {
70 if (*first1 < *first2) {
73 if (!(*first2 < *first1))
82using clock = std::chrono::steady_clock;
83using duration = std::chrono::steady_clock::duration;
97constexpr unsigned int hex_width()
102std::basic_ostream<char, std::char_traits<char>> &
103operator<<(std::basic_ostream<
char, std::char_traits<char>> &stream,
const hex &h);
107template<
typename T, std::enable_if_t<std::is_
integral_v<T>> * =
nullptr>
108details::hex
hex(T value,
unsigned int width = details::hex_width<T>())
110 return {
static_cast<std::make_unsigned_t<T>
>(value), width };
113size_t strlcpy(
char *dst,
const char *src,
size_t size);
116template<
typename Container,
typename UnaryOp>
117std::string join(
const Container &items,
const std::string &sep, UnaryOp op)
119 std::ostringstream ss;
122 for (
const auto &item : items) {
134template<
typename Container>
135std::string
join(
const Container &items,
const std::string &sep)
137 std::ostringstream ss;
140 for (
const auto &item : items) {
152template<
typename Container,
typename UnaryOp>
153std::string
join(
const Container &items,
const std::string &sep, UnaryOp op =
nullptr);
161 StringSplitter(
const std::string &str,
const std::string &delim);
166 using difference_type = std::size_t;
167 using value_type = std::string;
168 using pointer = value_type *;
169 using reference = value_type &;
170 using iterator_category = std::input_iterator_tag;
172 iterator(
const StringSplitter *ss, std::string::size_type pos);
174 iterator &operator++();
177 bool operator==(
const iterator &other)
const
179 return pos_ == other.pos_;
182 bool operator!=(
const iterator &other)
const
184 return !(*
this == other);
188 const StringSplitter *ss_;
189 std::string::size_type pos_;
190 std::string::size_type next_;
193 iterator begin()
const
200 return {
this, std::string::npos };
210details::StringSplitter
split(
const std::string &str,
const std::string &delim);
212std::string
toAscii(
const std::string &str);
217constexpr unsigned int alignDown(
unsigned int value,
unsigned int alignment)
219 return value / alignment * alignment;
222constexpr unsigned int alignUp(
unsigned int value,
unsigned int alignment)
224 return (value + alignment - 1) / alignment * alignment;
230struct reverse_adapter {
235auto begin(reverse_adapter<T> r)
237 return std::rbegin(r.iterable);
241auto end(reverse_adapter<T> r)
243 return std::rend(r.iterable);
249details::reverse_adapter<T>
reverse(T &&iterable)
256template<
typename Base>
257class enumerate_iterator
260 using base_reference =
typename std::iterator_traits<Base>::reference;
263 using difference_type =
typename std::iterator_traits<Base>::difference_type;
264 using value_type = std::pair<const std::size_t, base_reference>;
265 using pointer = value_type *;
266 using reference = value_type &;
267 using iterator_category = std::input_iterator_tag;
269 explicit enumerate_iterator(Base iter)
270 : current_(iter), pos_(0)
274 enumerate_iterator &operator++()
281 bool operator!=(
const enumerate_iterator &other)
const
283 return current_ != other.current_;
286 value_type operator*()
const
288 return { pos_, *current_ };
296template<
typename Base>
297class enumerate_adapter
300 using iterator = enumerate_iterator<Base>;
302 enumerate_adapter(Base begin, Base end)
303 : begin_(begin), end_(end)
307 iterator begin()
const
309 return iterator{ begin_ };
314 return iterator{ end_ };
327 return details::enumerate_adapter{ std::begin(iterable), std::end(iterable) };
330class Duration :
public std::chrono::duration<double, std::nano>
332 using BaseDuration = std::chrono::duration<double, std::nano>;
335 Duration() =
default;
337 template<
typename Rep>
343 template<
typename Rep,
typename Period>
344 constexpr Duration(
const std::chrono::duration<Rep, Period> &d)
349 template<
typename Period>
352 const auto c = std::chrono::duration_cast<std::chrono::duration<double, Period>>(*this);
358 return BaseDuration::operator-();
361 explicit constexpr operator bool()
const
363 return *
this != BaseDuration::zero();
376double strtod(
const char *__restrict nptr,
char **__restrict endptr);
381 return static_cast<std::underlying_type_t<Enum>
>(e);
389 void operator+=(std::function<
void()> &&action);
393 std::vector<std::function<void()>> actions_;
401 template<
typename Fn,
402 std::enable_if_t<!std::is_same_v<std::remove_cv_t<std::remove_reference_t<Fn>>, scope_exit> &&
403 std::is_constructible_v<EF, Fn>> * =
nullptr>
404 explicit scope_exit(Fn &&fn)
405 : exitFunction_(std::forward<Fn>(fn))
407 static_assert(std::is_nothrow_constructible_v<EF, Fn>);
429scope_exit(EF) -> scope_exit<EF>;
Utilities to help constructing class interfaces.
#define LIBCAMERA_DISABLE_COPY_AND_MOVE(klass)
Disable copy and move construction and assignment of the klass.
Definition class.h:29
Helper class from std::chrono::duration that represents a time duration in nanoseconds with double pr...
Definition utils.h:331
constexpr Duration operator-() const
Negation operator to negate a Duration.
Definition utils.h:356
constexpr Duration(const Rep &r)
Construct a Duration with r ticks.
Definition utils.h:338
double get() const
Retrieve the tick count, converted to the timebase provided by the template argument Period of type s...
Definition utils.h:350
constexpr Duration(const std::chrono::duration< Rep, Period > &d)
Construct a Duration by converting an arbitrary std::chrono::duration.
Definition utils.h:344
An object that performs actions upon destruction.
Definition utils.h:385
void release()
Remove all exit actions.
Definition utils.cpp:683
void operator+=(std::function< void()> &&action)
Add an exit action.
Definition utils.cpp:671
Top-level libcamera namespace.
Definition backtrace.h:17
std::ostream & operator<<(std::ostream &out, const Point &p)
Insert a text representation of a Point into an output stream.
Definition geometry.cpp:93
Matrix< U, Rows, Cols > operator*(T d, const Matrix< U, Rows, Cols > &m)
Multiply the matrix by a scalar.
Definition matrix.h:133
Helper type for type-matching std::visit() implementations.
Definition utils.h:41
unsigned int set_overlap(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2)
Count the number of elements in the intersection of two ranges.
Definition utils.h:64
constexpr unsigned int alignUp(unsigned int value, unsigned int alignment)
Align value up to alignment.
Definition utils.h:222
std::chrono::steady_clock::duration duration
The libcamera duration related to libcamera::utils::clock.
Definition utils.h:83
auto enumerate(T &iterable)
Wrap an iterable to enumerate index and value in a range-based loop.
Definition utils.h:325
const char * basename(const char *path)
Strip the directory prefix from the path.
Definition utils.cpp:67
details::StringSplitter split(const std::string &str, const std::string &delim)
Split a string based on a delimiter.
Definition utils.cpp:339
std::string time_point_to_string(const time_point &time)
Convert a time point to a string representation.
Definition utils.cpp:205
std::chrono::steady_clock::time_point time_point
The libcamera time point related to libcamera::utils::clock.
Definition utils.h:84
std::string join(const Container &items, const std::string &sep, UnaryOp op=nullptr)
Join elements of a container in a string with a separator.
std::string libcameraSourcePath()
Retrieve the path to the source directory.
Definition source_paths.cpp:114
std::string toAscii(const std::string &str)
Remove any non-ASCII characters from a string.
Definition utils.cpp:353
constexpr unsigned int alignDown(unsigned int value, unsigned int alignment)
Align value down to alignment.
Definition utils.h:217
char * secure_getenv(const char *name)
Get an environment variable.
Definition utils.cpp:91
std::chrono::steady_clock clock
The libcamera clock (monotonic).
Definition utils.h:82
details::reverse_adapter< T > reverse(T &&iterable)
Wrap an iterable to reverse iteration in a range-based loop.
Definition utils.h:249
decltype(auto) abs_diff(const T &a, const T &b)
Calculates the absolute value of the difference between two elements.
Definition utils.h:368
std::vector< typename T::key_type > map_keys(const T &map)
Retrieve the keys of a std::map<>.
Definition utils.h:55
std::string libcameraBuildPath()
Retrieve the path to the build directory.
Definition source_paths.cpp:74
struct timespec duration_to_timespec(const duration &value)
Convert a duration to a timespec.
Definition utils.cpp:191
constexpr std::underlying_type_t< Enum > to_underlying(Enum e) noexcept
Convert an enumeration to its underlygin type.
Definition utils.h:379
details::hex hex(T value, unsigned int width=details::hex_width< T >())
Write an hexadecimal value to an output string.
Definition utils.h:108
std::string dirname(const std::string &path)
Identify the dirname portion of a path.
Definition utils.cpp:113