#pragma once #include #include #include #include #include #include template class ResourceWrapper { public: ResourceWrapper(T *p = nullptr) : p_(p) { } ~ResourceWrapper() { free_resource(); } ResourceWrapper(const ResourceWrapper &) = delete; ResourceWrapper &operator=(const ResourceWrapper &) = delete; T *operator->() const { return p_; } bool operator!() const { return p_ == nullptr; } const T &operator[](size_t idx) const { assert(p_ != nullptr); return p_[idx]; } void reset(T *newp) { if (p_ != newp) { free_resource(); p_ = newp; } } friend inline bool operator==(const ResourceWrapper &lhs, std::nullptr_t) noexcept { return !lhs.p_; } friend inline bool operator!=(const ResourceWrapper &lhs, std::nullptr_t) noexcept { return !!lhs.p_; } friend inline T *get_impl(const ResourceWrapper &rw) { return rw.p_; } friend inline T **get_addr(ResourceWrapper &rw) { return &rw.p_; } private: T *p_; void free_resource() { if (p_) unref_res(p_); } }; namespace glib { typedef ResourceWrapper CharStr; typedef ResourceWrapper Error; } extern std::string utf8_to_locale_ign_err(const std::string &utf8_str); extern void for_each_file(const std::list &dirs_list, const std::string &suff, const std::list &order_list, const std::list &disable_list, const std::function &f); extern std::string json_escape_string(const std::string &str);