blob: cbde21e47353447b7a2b08e9ba99d79feb57156d [file] [log] [blame] [edit]
// Copyright 2023 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIB_DRIVER_DEVICETREE_VISITORS_DEFAULT_H_
#define LIB_DRIVER_DEVICETREE_VISITORS_DEFAULT_H_
#include <lib/driver/logging/cpp/logger.h>
#include "sdk/lib/driver/devicetree/node.h"
#include "sdk/lib/driver/devicetree/visitor.h"
#include "sdk/lib/driver/devicetree/visitors/bind-property.h"
namespace fdf_devicetree {
// A collection of visitors.
// Each visitor's Visit() is invoked during device tree Walk().
template <typename... Visitors>
class MultiVisitor : public Visitor {
public:
explicit MultiVisitor(fdf::Logger* logger) : Visitor(logger) { Init<0, Visitors...>(); }
~MultiVisitor() override = default;
template <int I, typename T, typename... Other>
constexpr void Init() {
visitors_[I] = std::unique_ptr<Visitor>(new T(logger_));
if constexpr (sizeof...(Other) > 1) {
Init<I + 1, Other...>();
} else if constexpr (sizeof...(Other) == 1) {
// We use make_unique here so that it deals with the parameter unpacking.
visitors_[I + 1] = std::unique_ptr<Visitor>(std::make_unique<Other...>(logger_).release());
}
}
zx::result<> Visit(Node& node) override {
for (size_t i = 0; i < visitors_.size(); i++) {
[[maybe_unused]] auto status = visitors_[i]->Visit(node);
}
return zx::ok();
}
private:
std::array<std::unique_ptr<Visitor>, sizeof...(Visitors)> visitors_;
};
using DefaultVisitor = MultiVisitor<BindPropertyVisitor>;
} // namespace fdf_devicetree
#endif // LIB_DRIVER_DEVICETREE_VISITORS_DEFAULT_H_