#pragma once #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 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_); } // Helper for enabling 'if (sp)' struct Tester { Tester() {} private: void operator delete(void*); }; public: // enable 'if (sp)' operator Tester*() const { if (!*this) return 0; static Tester t; return &t; } }; 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);