// services/network/public/mojom/mutable_partial_network_traffic_annotation_tag.mojom.cc is auto generated by mojom_bindings_generator.py, do not edit

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-private-field"
#endif

#include "services/network/public/mojom/mutable_partial_network_traffic_annotation_tag.mojom.h"

#include <math.h>
#include <stdint.h>
#include <utility>

#include "base/hash/md5_constexpr.h"
#include "base/run_loop.h"
#include "base/strings/string_number_conversions.h"
#include "base/trace_event/trace_event.h"
#include "base/trace_event/typed_macros.h"
#include "mojo/public/cpp/bindings/lib/generated_code_util.h"
#include "mojo/public/cpp/bindings/lib/message_internal.h"
#include "mojo/public/cpp/bindings/lib/send_message_helper.h"
#include "mojo/public/cpp/bindings/lib/proxy_to_responder.h"
#include "mojo/public/cpp/bindings/lib/serialization_util.h"
#include "mojo/public/cpp/bindings/lib/unserialized_message_context.h"
#include "mojo/public/cpp/bindings/lib/validate_params.h"
#include "mojo/public/cpp/bindings/lib/validation_errors.h"
#include "mojo/public/cpp/bindings/mojo_buildflags.h"
#include "mojo/public/interfaces/bindings/interface_control_messages.mojom.h"
#include "third_party/perfetto/include/perfetto/tracing/traced_value.h"

#include "services/network/public/mojom/mutable_partial_network_traffic_annotation_tag.mojom-params-data.h"
#include "services/network/public/mojom/mutable_partial_network_traffic_annotation_tag.mojom-shared-message-ids.h"

#include "services/network/public/mojom/mutable_partial_network_traffic_annotation_tag.mojom-import-headers.h"
#include "services/network/public/mojom/mutable_partial_network_traffic_annotation_tag.mojom-test-utils.h"


#ifndef SERVICES_NETWORK_PUBLIC_MOJOM_MUTABLE_PARTIAL_NETWORK_TRAFFIC_ANNOTATION_TAG_MOJOM_JUMBO_H_
#define SERVICES_NETWORK_PUBLIC_MOJOM_MUTABLE_PARTIAL_NETWORK_TRAFFIC_ANNOTATION_TAG_MOJOM_JUMBO_H_
#endif



namespace network {
namespace mojom {
MutablePartialNetworkTrafficAnnotationTag::MutablePartialNetworkTrafficAnnotationTag()
    : unique_id_hash_code(),
      completing_id_hash_code() {}

MutablePartialNetworkTrafficAnnotationTag::MutablePartialNetworkTrafficAnnotationTag(
    uint32_t unique_id_hash_code_in,
    uint32_t completing_id_hash_code_in)
    : unique_id_hash_code(std::move(unique_id_hash_code_in)),
      completing_id_hash_code(std::move(completing_id_hash_code_in)) {}

MutablePartialNetworkTrafficAnnotationTag::~MutablePartialNetworkTrafficAnnotationTag() = default;

void MutablePartialNetworkTrafficAnnotationTag::WriteIntoTrace(
    perfetto::TracedValue traced_context) const {
  auto dict = std::move(traced_context).WriteDictionary();
  perfetto::WriteIntoTracedValueWithFallback(
    dict.AddItem(
      "unique_id_hash_code"), this->unique_id_hash_code,
#if BUILDFLAG(MOJO_TRACE_ENABLED)
      "<value of type uint32_t>"
#else
      "<value>"
#endif  // BUILDFLAG(MOJO_TRACE_ENABLED)
    );
  perfetto::WriteIntoTracedValueWithFallback(
    dict.AddItem(
      "completing_id_hash_code"), this->completing_id_hash_code,
#if BUILDFLAG(MOJO_TRACE_ENABLED)
      "<value of type uint32_t>"
#else
      "<value>"
#endif  // BUILDFLAG(MOJO_TRACE_ENABLED)
    );
}

bool MutablePartialNetworkTrafficAnnotationTag::Validate(
    const void* data,
    mojo::internal::ValidationContext* validation_context) {
  return Data_::Validate(data, validation_context);
}


}  // namespace mojom
}  // namespace network


namespace mojo {


// static
bool StructTraits<::network::mojom::MutablePartialNetworkTrafficAnnotationTag::DataView, ::network::mojom::MutablePartialNetworkTrafficAnnotationTagPtr>::Read(
    ::network::mojom::MutablePartialNetworkTrafficAnnotationTag::DataView input,
    ::network::mojom::MutablePartialNetworkTrafficAnnotationTagPtr* output) {
  bool success = true;
  ::network::mojom::MutablePartialNetworkTrafficAnnotationTagPtr result(::network::mojom::MutablePartialNetworkTrafficAnnotationTag::New());
  
      if (success)
        result->unique_id_hash_code = input.unique_id_hash_code();
      if (success)
        result->completing_id_hash_code = input.completing_id_hash_code();
  *output = std::move(result);
  return success;
}

}  // namespace mojo


// Symbols declared in the -test-utils.h header are defined here instead of a
// separate .cc file to save compile time.


namespace network {
namespace mojom {




}  // namespace mojom
}  // namespace network


#if defined(__clang__)
#pragma clang diagnostic pop
#endif