11 // I wish Apple cared about providing quality toolchains :/
13 template <typename Function_>
16 template <typename Type_, typename... Args_>
17 class Functor<Type_ (Args_...)> {
19 virtual Type_ operator ()(Args_... args) const = 0;
22 template <typename Function_>
25 template <typename Value_, typename Type_, typename... Args_>
26 class FunctorImpl<Type_ (Value_::*)(Args_...) const> :
27 public Functor<Type_ (Args_...)>
33 FunctorImpl(const Value_ &value) :
38 virtual Type_ operator ()(Args_... args) const {
39 return (*value_)(args...);
43 template <typename Function_>
44 FunctorImpl<decltype(&Function_::operator())> fun(const Function_ &value) {
50 virtual void Save(const std::string &path, const Functor<void (std::streambuf &)> &code) = 0;
51 virtual bool Open(const std::string &path, const Functor<void (std::streambuf &)> &code) = 0;
52 virtual void Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code) = 0;
59 const std::string path_;
60 std::map<std::string, std::string> commit_;
62 std::string Path(const std::string &path);
65 DiskFolder(const std::string &path);
68 virtual void Save(const std::string &path, const Functor<void (std::streambuf &)> &code);
69 virtual bool Open(const std::string &path, const Functor<void (std::streambuf &)> &code);
70 virtual void Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code);
81 SubFolder(Folder *parent, const std::string &path);
83 virtual void Save(const std::string &path, const Functor<void (std::streambuf &)> &code);
84 virtual bool Open(const std::string &path, const Functor<void (std::streambuf &)> &code);
85 virtual void Find(const std::string &path, const Functor<void (const std::string &, const Functor<void (const Functor<void (std::streambuf &, std::streambuf &)> &)> &)> &code);
88 typedef std::map<uint32_t, std::vector<char>> Slots;
90 void Sign(const void *idata, size_t isize, std::streambuf &output, const std::string &identifier, const std::string &entitlements, const std::string &key, const Slots &slots);