nodeevents.h 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #ifndef NODE_NODEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66
  2. #define NODE_NODEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66
  3. #if defined(_MSC_VER) || \
  4. (defined(__GNUC__) && (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
  5. (__GNUC__ >= 4)) // GCC supports "pragma once" correctly since 3.4
  6. #pragma once
  7. #endif
  8. #include <map>
  9. #include <vector>
  10. #include "yaml-cpp/anchor.h"
  11. #include "yaml-cpp/node/ptr.h"
  12. namespace YAML {
  13. namespace detail {
  14. class node;
  15. } // namespace detail
  16. } // namespace YAML
  17. namespace YAML {
  18. class EventHandler;
  19. class Node;
  20. class NodeEvents {
  21. public:
  22. explicit NodeEvents(const Node& node);
  23. NodeEvents(const NodeEvents&) = delete;
  24. NodeEvents(NodeEvents&&) = delete;
  25. NodeEvents& operator=(const NodeEvents&) = delete;
  26. NodeEvents& operator=(NodeEvents&&) = delete;
  27. void Emit(EventHandler& handler);
  28. private:
  29. class AliasManager {
  30. public:
  31. AliasManager() : m_anchorByIdentity{}, m_curAnchor(0) {}
  32. void RegisterReference(const detail::node& node);
  33. anchor_t LookupAnchor(const detail::node& node) const;
  34. private:
  35. anchor_t _CreateNewAnchor() { return ++m_curAnchor; }
  36. private:
  37. using AnchorByIdentity = std::map<const detail::node_ref*, anchor_t>;
  38. AnchorByIdentity m_anchorByIdentity;
  39. anchor_t m_curAnchor;
  40. };
  41. void Setup(const detail::node& node);
  42. void Emit(const detail::node& node, EventHandler& handler,
  43. AliasManager& am) const;
  44. bool IsAliased(const detail::node& node) const;
  45. private:
  46. detail::shared_memory_holder m_pMemory;
  47. detail::node* m_root;
  48. using RefCount = std::map<const detail::node_ref*, int>;
  49. RefCount m_refCount;
  50. };
  51. } // namespace YAML
  52. #endif // NODE_NODEEVENTS_H_62B23520_7C8E_11DE_8A39_0800200C9A66