// Copyright 2017 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_LEDGER_BIN_APP_FIDL_SERIALIZATION_SIZE_H_
#define SRC_LEDGER_BIN_APP_FIDL_SERIALIZATION_SIZE_H_

#include <stddef.h>
#include <zircon/fidl.h>
#include <zircon/types.h>

#include "src/ledger/bin/fidl/include/types.h"

namespace ledger {
namespace fidl_serialization {

// Maximal size of data that will be returned inline.
inline constexpr size_t kMaxInlineDataSize = ZX_CHANNEL_MAX_MSG_BYTES * 9 / 10;
inline constexpr size_t kMaxMessageHandles = ZX_CHANNEL_MAX_MSG_HANDLES;

// TODO(mariagl): Remove dependency on FIDL internal structure layout, see
// LE-449.
inline constexpr size_t kPointerSize = sizeof(uintptr_t);
inline constexpr size_t kStatusEnumSize = sizeof(int32_t);
inline constexpr size_t kHandleSize = sizeof(zx_handle_t);
inline constexpr size_t kVectorHeaderSize = sizeof(fidl_vector_t);
inline constexpr size_t kPriorityEnumSize = sizeof(int32_t);
inline constexpr size_t kMessageHeaderSize = sizeof(fidl_message_header_t);

inline size_t Align(size_t n) { return FIDL_ALIGN(n); }

// The overhead for storing the pointer, the timestamp (int64) and the two
// arrays.
inline constexpr size_t kPageChangeHeaderSize =
    kPointerSize + sizeof(int64_t) + 2 * kVectorHeaderSize;

// Returns the fidl size of a byte vector with the given length.
size_t GetByteVectorSize(size_t vector_length);

// Returns the fidl size of an Entry holding a key with the given length.
size_t GetEntrySize(size_t key_length);

// Returns the fidl size of an InlinedEntry.
size_t GetInlinedEntrySize(const InlinedEntry& entry);

// Size of an object stored in memory (and accessed by a handle).
inline constexpr size_t kMemoryObjectSize = 2 * kPointerSize + kHandleSize;

// Returns the size of a DiffEntry object
size_t GetDiffEntrySize(size_t key_length, int number_of_values);

}  // namespace fidl_serialization
}  //  namespace ledger

#endif  // SRC_LEDGER_BIN_APP_FIDL_SERIALIZATION_SIZE_H_
