7 #ifndef _FCITX_UTILS_MISC_H_ 8 #define _FCITX_UTILS_MISC_H_ 17 #include <type_traits> 19 #include <fcitx-utils/fcitxutils_export.h> 20 #include <fcitx-utils/macros.h> 24 template <
class Parent,
class Member>
26 offsetFromPointerToMember(
const Member Parent::*ptr_to_member) {
27 const Parent *
const parent = 0;
28 const char *
const member =
static_cast<const char *
>(
29 static_cast<const void *
>(&(parent->*ptr_to_member)));
30 return std::ptrdiff_t(
31 member - static_cast<const char *>(static_cast<const void *>(parent)));
34 template <
class Parent,
class Member>
35 inline Parent *parentFromMember(Member *member,
36 const Member Parent::*ptr_to_member) {
37 return static_cast<Parent *
>(
38 static_cast<void *
>(
static_cast<char *
>(
static_cast<void *
>(member)) -
39 offsetFromPointerToMember(ptr_to_member)));
42 template <
class Parent,
class Member>
43 inline const Parent *parentFromMember(
const Member *member,
44 const Member Parent::*ptr_to_member) {
45 return static_cast<const Parent *
>(
static_cast<const void *
>(
46 static_cast<const char *
>(
static_cast<const void *
>(member)) -
47 offsetFromPointerToMember(ptr_to_member)));
50 template <
typename Iter>
53 using iterator_category =
typename Iter::iterator_category;
54 using value_type =
typename Iter::value_type::first_type;
55 using difference_type =
typename Iter::difference_type;
56 using reference =
typename Iter::value_type::first_type &;
57 using pointer =
typename Iter::value_type::first_type *;
60 FCITX_INLINE_DEFINE_DEFAULT_DTOR_AND_COPY(
KeyIterator)
62 bool operator==(
const KeyIterator &other)
const noexcept {
63 return iter_ == other.iter_;
65 bool operator!=(
const KeyIterator &other)
const noexcept {
66 return !operator==(other);
80 reference operator*() {
return iter_->first; }
82 pointer operator->() {
return &iter_->first; }
88 template <
typename It>
91 It begin()
const {
return begin_; }
92 It end()
const {
return end_; }
95 template <
typename Iter>
101 template <
typename T>
102 inline auto operator()(T
const value)
const {
103 return std::hash<std::underlying_type_t<T>>()(
104 static_cast<std::underlying_type_t<T>
>(value));
108 FCITXUTILS_EXPORT
void startProcess(
const std::vector<std::string> &args,
109 const std::string &workingDirectory = {});
111 FCITXUTILS_EXPORT std::string getProcessName(pid_t pid);
113 template <auto FreeFunction>
115 template <
typename T>
116 void operator()(T *p)
const {
118 FreeFunction(
const_cast<std::remove_const_t<T> *
>(p));
122 template <
typename T, auto FreeFunction = std::free>
123 using UniqueCPtr = std::unique_ptr<T, FunctionDeleter<FreeFunction>>;
125 sizeof(
char *) ==
sizeof(UniqueCPtr<char>),
126 "UniqueCPtr size is not same as raw pointer.");
128 using UniqueFilePtr = std::unique_ptr<FILE, FunctionDeleter<std::fclose>>;
130 template <
typename T>
131 inline auto makeUniqueCPtr(T *ptr) {
132 return UniqueCPtr<T>(ptr);
136 FCITXUTILS_DEPRECATED_EXPORT ssize_t getline(UniqueCPtr<char> &lineptr,
137 size_t *n, std::FILE *stream);
148 FCITXUTILS_EXPORT
bool isInFlatpak();
155 constexpr
bool isAndroid() {
156 #if defined(ANDROID) || defined(__ANDROID__) 168 constexpr
bool isApple() {
169 #if defined(__APPLE__) 181 constexpr
bool isEmscripten() {
182 #if defined(__EMSCRIPTEN__) 194 constexpr
bool isWindows() {
204 #endif // _FCITX_UTILS_MISC_H_