blob: 8f22e3be955ca2dfce4d5180dc64981bcdd4c9fe [file] [log] [blame]
// Copyright 2019 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 SRC_LIB_FIDL_CODEC_VISITOR_H_
#define SRC_LIB_FIDL_CODEC_VISITOR_H_
#include "src/lib/fidl_codec/wire_object.h"
#include "src/lib/fidl_codec/wire_types.h"
namespace fidl_codec {
// Superclass for implementing visitors for Values. Note that the whole class is protected. To use a
// visitor, use the Visit method on the Value object you want to visit.
class Visitor {
protected:
virtual void VisitValue(const Value* node, const Type* for_type) {}
virtual void VisitInvalidValue(const InvalidValue* node, const Type* for_type) {
VisitValue(node, for_type);
}
virtual void VisitNullValue(const NullValue* node, const Type* for_type) {
VisitValue(node, for_type);
}
virtual void VisitRawValue(const RawValue* node, const Type* for_type) {
VisitValue(node, for_type);
}
virtual void VisitBoolValue(const BoolValue* node, const Type* for_type) {
VisitValue(node, for_type);
}
virtual void VisitIntegerValue(const IntegerValue* node, const Type* for_type) {
VisitValue(node, for_type);
}
virtual void VisitDoubleValue(const DoubleValue* node, const Type* for_type) {
VisitValue(node, for_type);
}
virtual void VisitStringValue(const StringValue* node, const Type* for_type) {
VisitValue(node, for_type);
}
virtual void VisitHandleValue(const HandleValue* node, const Type* for_type) {
VisitValue(node, for_type);
}
virtual void VisitUnionValue(const UnionValue* node, const Type* for_type) {
node->value()->Visit(this, node->member().type());
}
virtual void VisitStructValue(const StructValue* node, const Type* for_type) {
for (const auto& field : node->fields()) {
field.second->Visit(this, field.first->type());
}
}
virtual void VisitVectorValue(const VectorValue* node, const Type* for_type) {
FX_DCHECK(for_type != nullptr);
const Type* component_type = for_type->GetComponentType();
FX_DCHECK(component_type != nullptr);
for (const auto& value : node->values()) {
value->Visit(this, component_type);
}
}
virtual void VisitTableValue(const TableValue* node, const Type* for_type) {
for (const auto& member : node->members()) {
member.second->Visit(this, member.first->type());
}
}
virtual void VisitFidlMessageValue(const FidlMessageValue* node, const Type* for_type) {
if (node->decoded_request() != nullptr) {
node->decoded_request()->Visit(this, nullptr);
}
if (node->decoded_response() != nullptr) {
node->decoded_response()->Visit(this, nullptr);
}
}
friend class Value;
friend class InvalidValue;
friend class NullValue;
friend class RawValue;
friend class BoolValue;
friend class IntegerValue;
friend class DoubleValue;
friend class StringValue;
friend class HandleValue;
friend class UnionValue;
friend class StructValue;
friend class VectorValue;
friend class TableValue;
friend class FidlMessageValue;
};
} // namespace fidl_codec
#endif // SRC_LIB_FIDL_CODEC_VISITOR_H_