instrumentation.h 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * Copyright (c) Facebook, Inc. and its affiliates.
  3. *
  4. * This source code is licensed under the MIT license found in the LICENSE
  5. * file in the root directory of this source tree.
  6. */
  7. #include "YGConfig.h"
  8. #include "YGMarker.h"
  9. #include "YGNode.h"
  10. namespace facebook {
  11. namespace yoga {
  12. namespace marker {
  13. template <YGMarker MarkerType>
  14. class MarkerSection {
  15. private:
  16. using Data = detail::MarkerData<MarkerType>;
  17. public:
  18. MarkerSection(YGNodeRef node) : MarkerSection{node, node->getConfig()} {}
  19. ~MarkerSection() {
  20. if (endMarker_) {
  21. endMarker_(MarkerType, node_, markerData(&data), userData_);
  22. }
  23. }
  24. typename Data::type data = {};
  25. template <typename Ret, typename... Args>
  26. static Ret wrap(
  27. YGNodeRef node,
  28. Ret (YGNode::*method)(Args...),
  29. Args... args) {
  30. MarkerSection<MarkerType> section{node};
  31. return (node->*method)(std::forward<Args>(args)...);
  32. }
  33. private:
  34. decltype(YGMarkerCallbacks{}.endMarker) endMarker_;
  35. YGNodeRef node_;
  36. void* userData_;
  37. MarkerSection(YGNodeRef node, YGConfigRef config)
  38. : MarkerSection{node, config ? &config->markerCallbacks : nullptr} {}
  39. MarkerSection(YGNodeRef node, YGMarkerCallbacks* callbacks)
  40. : endMarker_{callbacks ? callbacks->endMarker : nullptr},
  41. node_{node},
  42. userData_{
  43. callbacks && callbacks->startMarker
  44. ? callbacks->startMarker(MarkerType, node, markerData(&data))
  45. : nullptr} {}
  46. static YGMarkerData markerData(typename Data::type* d) {
  47. YGMarkerData markerData = {};
  48. Data::get(markerData) = d;
  49. return markerData;
  50. }
  51. };
  52. } // namespace marker
  53. } // namespace yoga
  54. } // namespace facebook