// 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.

library zx;

// These are all aliases that will be subsumed by the future implementation of
// templating, constraints, etc. in fidlc.
//
// The right hand side is completely ignored by kazoo, that is, only the name of
// the alias is significant. Generally the right hand side is set so that if
// there were no handling of the alias (and the alias was "expanded" as is the
// default behaviour), it would result in something sensible.

// TODO(fidlc): (mutable) char*
alias charptr = uint64;

// TODO(fidl)
alias const_futexptr = int32;

// TODO(fidlc): const void*
alias const_voidptr = uint64;

// TODO(fidlc): mutable<string>
alias mutable_string = string;

// TODO(fidlc): mutable<uint32>
alias mutable_uint32 = uint32;

// TODO(fidlc): mutable<usize>
alias mutable_usize = usize;

// TODO(fidlc): uint32 size
// TODO(fidlc): mutable<vector<HandleDisposition>
alias mutable_vector_HandleDisposition_u32size = vector<HandleDisposition>;

// TODO(fidlc): uint32 size
// TODO(fidlc): vector<HandleInfo>
alias mutable_vector_HandleInfo_u32size = vector<HandleInfo>;

// TODO(fidlc): mutable<ChannelCallEtcArgs>
alias mutable_ChannelCallEtcArgs = ChannelCallEtcArgs;

// TODO(fidlc): mutable<vector<WaitItem>>
alias mutable_vector_WaitItem = vector<WaitItem>;

// TODO(fidlc): uint32 size
// TODO(fidlc): mutable<vector<handle>
alias mutable_vector_handle_u32size = vector<handle>;

// TODO(fidlc): mutable<vector<void>>
alias mutable_vector_void = vector<byte>;

// TODO(fidlc): uint32 size
// TODO(fidlc): mutable<vector<void>>
alias mutable_vector_void_u32size = vector<byte>;

// TODO(fidlc): optional<PciBar>
alias optional_PciBar = PciBar;

// TODO(fidlc): optional<PortPacket>
alias optional_PortPacket = PortPacket;

// TODO(fidlc): optional<koid>
alias optional_koid = koid;

// TODO(fidlc): optional<signals>
alias optional_signals = signals;

// TODO(fidlc): optional<time>
alias optional_time = time;

// TODO(fidlc): optional<uint32>
alias optional_uint32 = uint32;

// TODO(fidlc): optional<usize>
alias optional_usize = usize;

// TODO(fidlc): optional<usize>
alias optional_off = off;

// TODO(fidlc): uint32 size
// TODO(fidlc): vector<HandleInfo>
alias vector_HandleInfo_u32size = vector<HandleInfo>;

// TODO(fidlc): vector<handle> uint32 size
alias vector_handle_u32size = vector<handle>;

// TODO(fidlc): vector<paddr>>
alias vector_paddr = vector<paddr>;

// TODO(fidlc): vector<void>
alias vector_void = vector<byte>;

// TODO(fidlc): vector<iovec>
alias vector_iovec = vector<byte>;

// TODO(fidlc): uint32 size
// TODO(fidlc): vector<void>
alias vector_void_u32size = vector<byte>;

// TODO(fidlc): (mutable) void*
alias voidptr = uint64;

// This is <zircon/string_view.h>'s zx_string_view_t in C/C++.
alias string_view = uint64;
