79 SchemaFrame(
const SchemaFrame &) =
delete;
80 auto operator=(
const SchemaFrame &) -> SchemaFrame & =
delete;
81 SchemaFrame(SchemaFrame &&) =
delete;
82 auto operator=(SchemaFrame &&) -> SchemaFrame & =
delete;
85 [[nodiscard]]
auto mode() const noexcept -> Mode {
return this->mode_; }
89 std::string_view original;
92 sourcemeta::core::JSON::String destination;
94 std::string_view base;
95 std::optional<std::string_view> fragment;
106 std::map<std::pair<SchemaReferenceType, sourcemeta::core::WeakPointer>,
110#pragma GCC diagnostic push
113#pragma GCC diagnostic ignored "-Wshadow"
125#pragma GCC diagnostic pop
130 std::optional<sourcemeta::core::WeakPointer> parent;
132 std::string_view base;
133 sourcemeta::core::WeakPointer pointer;
134 std::size_t relative_pointer;
152 std::map<std::pair<SchemaReferenceType, sourcemeta::core::JSON::String>,
156 using Paths = std::vector<sourcemeta::core::WeakPointer>;
160 const std::optional<sourcemeta::core::PointerPositionTracker> &tracker =
161 std::nullopt)
const -> sourcemeta::core::JSON;
167 std::string_view default_dialect =
"",
168 std::string_view default_id =
"",
169 const Paths &paths = {sourcemeta::core::empty_weak_pointer})
176 [[nodiscard]] auto references() const noexcept -> const
References &;
181 const sourcemeta::core::WeakPointer &pointer) const
185 [[nodiscard]] auto standalone() const noexcept ->
bool;
188 [[nodiscard]] auto root() const noexcept
189 -> const sourcemeta::core::JSON::String &;
192 [[nodiscard]] auto vocabularies(const
Location &location,
199 const sourcemeta::core::WeakPointer &relative_schema_location =
200 sourcemeta::core::empty_weak_pointer) const
201 -> sourcemeta::core::JSON::String;
206 const sourcemeta::core::WeakPointer &relative_schema_location) const
210 [[nodiscard]] auto traverse(const std::string_view uri) const
211 -> std::optional<std::reference_wrapper<const
Location>>;
215 traverse(const sourcemeta::core::WeakPointer &pointer) const
216 -> std::optional<std::reference_wrapper<const
Location>>;
219 [[nodiscard]] auto traverse(const sourcemeta::core::WeakPointer &pointer,
221 -> std::optional<std::reference_wrapper<const
Location>>;
224 [[nodiscard]] auto uri(const sourcemeta::core::WeakPointer &pointer) const
226 std::reference_wrapper<const sourcemeta::core::JSON::String>>;
231 const sourcemeta::core::WeakPointer &relative_schema_location =
232 sourcemeta::core::empty_weak_pointer) const
234 std::optional<std::reference_wrapper<const
Location>>>;
237 template <std::invocable<std::string_view> F>
238 auto for_each_resource_uri(const F &callback) const ->
void {
239 for (
const auto &[key, location] : this->locations_) {
240 if (location.type == LocationType::Resource) {
241 callback(key.second);
248 template <std::invocable<
const sourcemeta::core::WeakPointer &,
249 const ReferencesEntry &>
252 for (
const auto &[key, reference] : this->references_) {
253 if (!this->traverse(reference.destination).has_value()) {
254 callback(key.second, reference);
271 const sourcemeta::core::WeakPointer::Token &tail)
const
276 -> sourcemeta::core::WeakPointer;
279 [[nodiscard]]
auto empty() const noexcept ->
bool;
282 auto reset() ->
void;
285 [[nodiscard]] auto is_reachable(const
Location &base,
296#pragma warning(disable : 4251 4275)
298 sourcemeta::core::JSON::String root_;
304 std::unordered_map<sourcemeta::core::JSON::String,
305 const sourcemeta::core::JSON *>
307 mutable std::unordered_map<
308 std::reference_wrapper<const sourcemeta::core::WeakPointer>,
309 std::vector<const Location *>, sourcemeta::core::WeakPointer::Hasher,
310 sourcemeta::core::WeakPointer::Comparator>
311 pointer_to_location_;
312 mutable std::unordered_set<
313 std::reference_wrapper<const sourcemeta::core::WeakPointer>,
314 sourcemeta::core::WeakPointer::Hasher,
315 sourcemeta::core::WeakPointer::Comparator>
316 pointers_with_non_orphan_;
317 using ReachabilityCache =
318 std::unordered_map<const sourcemeta::core::WeakPointer *, bool>;
319 struct ReachabilityKey {
320 const sourcemeta::core::WeakPointer *pointer;
322 auto operator==(
const ReachabilityKey &other)
const noexcept ->
bool {
323 return this->pointer == other.pointer && this->orphan == other.orphan;
326 struct ReachabilityKeyHasher {
327 auto operator()(
const ReachabilityKey &key)
const noexcept -> std::size_t {
328 return std::hash<const void *>{}(key.pointer) ^
329 (std::hash<bool>{}(key.orphan) << 1);
332 mutable std::unordered_map<ReachabilityKey, ReachabilityCache,
333 ReachabilityKeyHasher>
335 mutable std::unordered_map<
336 std::reference_wrapper<const sourcemeta::core::WeakPointer>,
337 std::vector<const sourcemeta::core::WeakPointer *>,
338 sourcemeta::core::WeakPointer::Hasher,
339 sourcemeta::core::WeakPointer::Comparator>
340 references_by_destination_;
341 mutable std::unordered_set<
342 std::reference_wrapper<const sourcemeta::core::WeakPointer>,
343 sourcemeta::core::WeakPointer::Hasher,
344 sourcemeta::core::WeakPointer::Comparator>
345 location_members_children_;
346 mutable std::unordered_map<
347 std::reference_wrapper<const sourcemeta::core::WeakPointer>,
348 std::vector<const Location *>, sourcemeta::core::WeakPointer::Hasher,
349 sourcemeta::core::WeakPointer::Comparator>
350 descendants_by_pointer_;
351 struct PotentialSource {
352 const sourcemeta::core::WeakPointer *source_pointer;
353 sourcemeta::core::WeakPointer source_parent;
356 mutable std::unordered_map<const Location *, std::vector<PotentialSource>>
357 potential_sources_by_location_;
358 struct ReachabilityEdge {
359 const Location *target;
360 bool orphan_context_only;
363 mutable std::unordered_map<const Location *, std::vector<ReachabilityEdge>>
365 mutable std::unordered_map<
366 std::reference_wrapper<const sourcemeta::core::WeakPointer>,
367 const sourcemeta::core::WeakPointer *,
368 sourcemeta::core::WeakPointer::Hasher,
369 sourcemeta::core::WeakPointer::Comparator>
371 mutable std::unordered_map<
const Location *,
372 const sourcemeta::core::WeakPointer *>
373 location_to_canonical_;
374 bool standalone_{
false};
376 auto populate_pointer_to_location() const ->
void;
377 auto populate_reference_graph() const ->
void;
378 auto populate_location_members(const SchemaWalker &walker,
379 const SchemaResolver &resolver) const ->
void;
380 auto populate_descendants() const ->
void;
381 auto populate_potential_sources(const SchemaWalker &walker,
382 const SchemaResolver &resolver) const ->
void;
383 auto populate_reachability_graph(const SchemaWalker &walker,
384 const SchemaResolver &resolver) const
386 auto populate_reachability(const Location &base, const SchemaWalker &walker,
387 const SchemaResolver &resolver) const
388 -> const ReachabilityCache &;
390#pragma warning(default : 4251 4275)