document_cache.h 756 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #pragma once
  2. #include <map>
  3. #include <optional>
  4. #include <jvalidate/forward.h>
  5. #include <jvalidate/uri.h>
  6. namespace jvalidate {
  7. template <Adapter A> class DocumentCache {
  8. public:
  9. using value_type = typename A::value_type;
  10. private:
  11. URIResolver<A> resolve_;
  12. std::map<URI, value_type> cache_;
  13. public:
  14. DocumentCache() = default;
  15. DocumentCache(URIResolver<A> const & resolve) : resolve_(resolve) {}
  16. operator bool() const { return resolve_; }
  17. std::optional<A> try_load(URI const & uri) {
  18. if (not resolve_) {
  19. return std::nullopt;
  20. }
  21. auto [it, created] = cache_.try_emplace(uri);
  22. if (created && not resolve_(uri, it->second)) {
  23. cache_.erase(it);
  24. return std::nullopt;
  25. }
  26. return A(it->second);
  27. }
  28. };
  29. }