diff options
author | Kieran Bingham <kieran.bingham@ideasonboard.com> | 2021-06-15 15:40:45 +0100 |
---|---|---|
committer | Kieran Bingham <kieran.bingham@ideasonboard.com> | 2021-06-25 16:11:02 +0100 |
commit | cbdc93e9d1666010d49e06940158a37c61cc6fa7 (patch) | |
tree | e9ed00bdb6e7131b003ec7f7bb03eceab311cc23 /include/libcamera/internal | |
parent | 86eaa6c5e10dde632f17b900ea0e3aa4d61cb3b3 (diff) |
libcamera/base: Move utils to the base library
Move the utils functionality to the libcamera/base library.
Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Kieran Bingham <kieran.bingham@ideasonboard.com>
Diffstat (limited to 'include/libcamera/internal')
-rw-r--r-- | include/libcamera/internal/log.h | 2 | ||||
-rw-r--r-- | include/libcamera/internal/meson.build | 1 | ||||
-rw-r--r-- | include/libcamera/internal/thread.h | 3 | ||||
-rw-r--r-- | include/libcamera/internal/utils.h | 355 |
4 files changed, 3 insertions, 358 deletions
diff --git a/include/libcamera/internal/log.h b/include/libcamera/internal/log.h index b8efb161..9c2beab6 100644 --- a/include/libcamera/internal/log.h +++ b/include/libcamera/internal/log.h @@ -12,7 +12,7 @@ #include <libcamera/class.h> -#include "libcamera/internal/utils.h" +#include <libcamera/base/utils.h> namespace libcamera { diff --git a/include/libcamera/internal/meson.build b/include/libcamera/internal/meson.build index 205b36a9..1348e926 100644 --- a/include/libcamera/internal/meson.build +++ b/include/libcamera/internal/meson.build @@ -43,7 +43,6 @@ libcamera_internal_headers = files([ 'sysfs.h', 'thread.h', 'timer.h', - 'utils.h', 'v4l2_device.h', 'v4l2_pixelformat.h', 'v4l2_subdevice.h', diff --git a/include/libcamera/internal/thread.h b/include/libcamera/internal/thread.h index 25d0308d..9662e28b 100644 --- a/include/libcamera/internal/thread.h +++ b/include/libcamera/internal/thread.h @@ -14,8 +14,9 @@ #include <libcamera/signal.h> +#include <libcamera/base/utils.h> + #include "libcamera/internal/message.h" -#include "libcamera/internal/utils.h" namespace libcamera { diff --git a/include/libcamera/internal/utils.h b/include/libcamera/internal/utils.h deleted file mode 100644 index 15beb0f4..00000000 --- a/include/libcamera/internal/utils.h +++ /dev/null @@ -1,355 +0,0 @@ -/* SPDX-License-Identifier: LGPL-2.1-or-later */ -/* - * Copyright (C) 2018, Google Inc. - * - * utils.h - Miscellaneous utility functions - */ -#ifndef __LIBCAMERA_INTERNAL_UTILS_H__ -#define __LIBCAMERA_INTERNAL_UTILS_H__ - -#include <algorithm> -#include <chrono> -#include <iterator> -#include <memory> -#include <ostream> -#include <sstream> -#include <string> -#include <string.h> -#include <sys/time.h> -#include <utility> -#include <vector> - -#ifndef __DOXYGEN__ - -/* uClibc and uClibc-ng don't provide O_TMPFILE */ -#ifndef O_TMPFILE -#define O_TMPFILE (020000000 | O_DIRECTORY) -#endif - -#endif - -namespace libcamera { - -namespace utils { - -const char *basename(const char *path); - -char *secure_getenv(const char *name); -std::string dirname(const std::string &path); - -template<typename T> -std::vector<typename T::key_type> map_keys(const T &map) -{ - std::vector<typename T::key_type> keys; - std::transform(map.begin(), map.end(), std::back_inserter(keys), - [](const auto &value) { return value.first; }); - return keys; -} - -template<class InputIt1, class InputIt2> -unsigned int set_overlap(InputIt1 first1, InputIt1 last1, - InputIt2 first2, InputIt2 last2) -{ - unsigned int count = 0; - - while (first1 != last1 && first2 != last2) { - if (*first1 < *first2) { - ++first1; - } else { - if (!(*first2 < *first1)) - count++; - ++first2; - } - } - - return count; -} - -using clock = std::chrono::steady_clock; -using duration = std::chrono::steady_clock::duration; -using time_point = std::chrono::steady_clock::time_point; - -struct timespec duration_to_timespec(const duration &value); -std::string time_point_to_string(const time_point &time); - -#ifndef __DOXYGEN__ -struct _hex { - uint64_t v; - unsigned int w; -}; - -std::basic_ostream<char, std::char_traits<char>> & -operator<<(std::basic_ostream<char, std::char_traits<char>> &stream, const _hex &h); -#endif - -template<typename T> -_hex hex(T value, unsigned int width = 0); - -#ifndef __DOXYGEN__ -template<> -inline _hex hex<int32_t>(int32_t value, unsigned int width) -{ - return { static_cast<uint64_t>(value), width ? width : 8 }; -} - -template<> -inline _hex hex<uint32_t>(uint32_t value, unsigned int width) -{ - return { static_cast<uint64_t>(value), width ? width : 8 }; -} - -template<> -inline _hex hex<int64_t>(int64_t value, unsigned int width) -{ - return { static_cast<uint64_t>(value), width ? width : 16 }; -} - -template<> -inline _hex hex<uint64_t>(uint64_t value, unsigned int width) -{ - return { static_cast<uint64_t>(value), width ? width : 16 }; -} -#endif - -size_t strlcpy(char *dst, const char *src, size_t size); - -#ifndef __DOXYGEN__ -template<typename Container, typename UnaryOp> -std::string join(const Container &items, const std::string &sep, UnaryOp op) -{ - std::ostringstream ss; - bool first = true; - - for (typename Container::const_iterator it = std::begin(items); - it != std::end(items); ++it) { - if (!first) - ss << sep; - else - first = false; - - ss << op(*it); - } - - return ss.str(); -} - -template<typename Container> -std::string join(const Container &items, const std::string &sep) -{ - std::ostringstream ss; - bool first = true; - - for (typename Container::const_iterator it = std::begin(items); - it != std::end(items); ++it) { - if (!first) - ss << sep; - else - first = false; - - ss << *it; - } - - return ss.str(); -} -#else -template<typename Container, typename UnaryOp> -std::string join(const Container &items, const std::string &sep, UnaryOp op = nullptr); -#endif - -namespace details { - -class StringSplitter -{ -public: - StringSplitter(const std::string &str, const std::string &delim); - - class iterator - { - public: - iterator(const StringSplitter *ss, std::string::size_type pos); - - iterator &operator++(); - std::string operator*() const; - bool operator!=(const iterator &other) const; - - private: - const StringSplitter *ss_; - std::string::size_type pos_; - std::string::size_type next_; - }; - - iterator begin() const; - iterator end() const; - -private: - std::string str_; - std::string delim_; -}; - -} /* namespace details */ - -details::StringSplitter split(const std::string &str, const std::string &delim); - -std::string toAscii(const std::string &str); - -std::string libcameraBuildPath(); -std::string libcameraSourcePath(); - -constexpr unsigned int alignDown(unsigned int value, unsigned int alignment) -{ - return value / alignment * alignment; -} - -constexpr unsigned int alignUp(unsigned int value, unsigned int alignment) -{ - return (value + alignment - 1) / alignment * alignment; -} - -namespace details { - -template<typename T> -struct reverse_adapter { - T &iterable; -}; - -template<typename T> -auto begin(reverse_adapter<T> r) -{ - return std::rbegin(r.iterable); -} - -template<typename T> -auto end(reverse_adapter<T> r) -{ - return std::rend(r.iterable); -} - -} /* namespace details */ - -template<typename T> -details::reverse_adapter<T> reverse(T &&iterable) -{ - return { iterable }; -} - -namespace details { - -template<typename Base> -class enumerate_iterator -{ -private: - using base_reference = typename std::iterator_traits<Base>::reference; - -public: - using difference_type = typename std::iterator_traits<Base>::difference_type; - using value_type = std::pair<const difference_type, base_reference>; - using pointer = value_type *; - using reference = value_type &; - using iterator_category = std::input_iterator_tag; - - explicit enumerate_iterator(Base iter) - : current_(iter), pos_(0) - { - } - - enumerate_iterator &operator++() - { - ++current_; - ++pos_; - return *this; - } - - bool operator!=(const enumerate_iterator &other) const - { - return current_ != other.current_; - } - - value_type operator*() const - { - return { pos_, *current_ }; - } - -private: - Base current_; - difference_type pos_; -}; - -template<typename Base> -class enumerate_adapter -{ -public: - using iterator = enumerate_iterator<Base>; - - enumerate_adapter(Base begin, Base end) - : begin_(begin), end_(end) - { - } - - iterator begin() const - { - return iterator{ begin_ }; - } - - iterator end() const - { - return iterator{ end_ }; - } - -private: - const Base begin_; - const Base end_; -}; - -} /* namespace details */ - -template<typename T> -auto enumerate(T &iterable) -> details::enumerate_adapter<decltype(iterable.begin())> -{ - return { std::begin(iterable), std::end(iterable) }; -} - -#ifndef __DOXYGEN__ -template<typename T, size_t N> -auto enumerate(T (&iterable)[N]) -> details::enumerate_adapter<T *> -{ - return { std::begin(iterable), std::end(iterable) }; -} -#endif - -class Duration : public std::chrono::duration<double, std::nano> -{ - using BaseDuration = std::chrono::duration<double, std::nano>; - -public: - Duration() = default; - - template<typename Rep, typename Period> - constexpr Duration(const std::chrono::duration<Rep, Period> &d) - : BaseDuration(d) - { - } - - template<typename Period> - double get() const - { - auto const c = std::chrono::duration_cast<std::chrono::duration<double, Period>>(*this); - return c.count(); - } - - explicit constexpr operator bool() const - { - return *this != BaseDuration::zero(); - } -}; - -} /* namespace utils */ - -#ifndef __DOXYGEN__ -template<class CharT, class Traits> -std::basic_ostream<CharT, Traits> &operator<<(std::basic_ostream<CharT, Traits> &os, - const utils::Duration &d); -#endif - -} /* namespace libcamera */ - -#endif /* __LIBCAMERA_INTERNAL_UTILS_H__ */ |