// Copyright (c) 2020 Marshall A. Greenblatt. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
//    * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
//    * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
//    * Neither the name of Google Inc. nor the name Chromium Embedded
// Framework nor the names of its contributors may be used to endorse
// or promote products derived from this software without specific prior
// written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// ---------------------------------------------------------------------------
//
// This file was generated by the CEF translator tool and should not edited
// by hand. See the translator.README.txt file in the tools directory for
// more information.
//
// $hash=a5d8033127cf2d21f1cb0c87f76d2d59ec3eace0$
//

#ifndef CEF_INCLUDE_CAPI_TEST_CEF_TRANSLATOR_TEST_CAPI_H_
#define CEF_INCLUDE_CAPI_TEST_CEF_TRANSLATOR_TEST_CAPI_H_
#pragma once

#if !defined(BUILDING_CEF_SHARED) && !defined(WRAPPING_CEF_SHARED) && \
    !defined(UNIT_TEST)
#error This file can be included for unit tests only
#endif

#include "include/capi/cef_base_capi.h"

#ifdef __cplusplus
extern "C" {
#endif

struct _cef_translator_test_ref_ptr_client_child_t;
struct _cef_translator_test_ref_ptr_client_t;
struct _cef_translator_test_ref_ptr_library_child_t;
struct _cef_translator_test_ref_ptr_library_t;
struct _cef_translator_test_scoped_client_child_t;
struct _cef_translator_test_scoped_client_t;
struct _cef_translator_test_scoped_library_child_t;
struct _cef_translator_test_scoped_library_t;

///
// Structure for testing all of the possible data transfer types.
///
typedef struct _cef_translator_test_t {
  ///
  // Base structure.
  ///
  cef_base_ref_counted_t base;

  // PRIMITIVE VALUES

  ///
  // Return a void value.
  ///
  void(CEF_CALLBACK* get_void)(struct _cef_translator_test_t* self);

  ///
  // Return a bool value.
  ///
  int(CEF_CALLBACK* get_bool)(struct _cef_translator_test_t* self);

  ///
  // Return an int value.
  ///
  int(CEF_CALLBACK* get_int)(struct _cef_translator_test_t* self);

  ///
  // Return a double value.
  ///
  double(CEF_CALLBACK* get_double)(struct _cef_translator_test_t* self);

  ///
  // Return a long value.
  ///
  long(CEF_CALLBACK* get_long)(struct _cef_translator_test_t* self);

  ///
  // Return a size_t value.
  ///
  size_t(CEF_CALLBACK* get_sizet)(struct _cef_translator_test_t* self);

  ///
  // Set a void value.
  ///
  int(CEF_CALLBACK* set_void)(struct _cef_translator_test_t* self);

  ///
  // Set a bool value.
  ///
  int(CEF_CALLBACK* set_bool)(struct _cef_translator_test_t* self, int val);

  ///
  // Set an int value.
  ///
  int(CEF_CALLBACK* set_int)(struct _cef_translator_test_t* self, int val);

  ///
  // Set a double value.
  ///
  int(CEF_CALLBACK* set_double)(struct _cef_translator_test_t* self,
                                double val);

  ///
  // Set a long value.
  ///
  int(CEF_CALLBACK* set_long)(struct _cef_translator_test_t* self, long val);

  ///
  // Set a size_t value.
  ///
  int(CEF_CALLBACK* set_sizet)(struct _cef_translator_test_t* self, size_t val);

  ///
  // Set a int list value.
  ///
  int(CEF_CALLBACK* set_int_list)(struct _cef_translator_test_t* self,
                                  size_t valCount,
                                  int const* val);

  ///
  // Return an int list value by out-param.
  ///
  int(CEF_CALLBACK* get_int_list_by_ref)(struct _cef_translator_test_t* self,
                                         size_t* valCount,
                                         int* val);

  ///
  // Return the number of points that will be output above.
  ///
  size_t(CEF_CALLBACK* get_int_list_size)(struct _cef_translator_test_t* self);

  // STRING VALUES

  ///
  // Return a string value.
  ///
  // The resulting string must be freed by calling cef_string_userfree_free().
  cef_string_userfree_t(CEF_CALLBACK* get_string)(
      struct _cef_translator_test_t* self);

  ///
  // Set a string value.
  ///
  int(CEF_CALLBACK* set_string)(struct _cef_translator_test_t* self,
                                const cef_string_t* val);

  ///
  // Return a string value by out-param.
  ///
  void(CEF_CALLBACK* get_string_by_ref)(struct _cef_translator_test_t* self,
                                        cef_string_t* val);

  ///
  // Set a string list value.
  ///
  int(CEF_CALLBACK* set_string_list)(struct _cef_translator_test_t* self,
                                     cef_string_list_t val);

  ///
  // Return a string list value by out-param.
  ///
  int(CEF_CALLBACK* get_string_list_by_ref)(struct _cef_translator_test_t* self,
                                            cef_string_list_t val);

  ///
  // Set a string map value.
  ///
  int(CEF_CALLBACK* set_string_map)(struct _cef_translator_test_t* self,
                                    cef_string_map_t val);

  ///
  // Return a string map value by out-param.
  ///
  int(CEF_CALLBACK* get_string_map_by_ref)(struct _cef_translator_test_t* self,
                                           cef_string_map_t val);

  ///
  // Set a string multimap value.
  ///
  int(CEF_CALLBACK* set_string_multimap)(struct _cef_translator_test_t* self,
                                         cef_string_multimap_t val);

  ///
  // Return a string multimap value by out-param.
  ///
  int(CEF_CALLBACK* get_string_multimap_by_ref)(
      struct _cef_translator_test_t* self,
      cef_string_multimap_t val);

  // STRUCT VALUES

  ///
  // Return a point value.
  ///
  cef_point_t(CEF_CALLBACK* get_point)(struct _cef_translator_test_t* self);

  ///
  // Set a point value.
  ///
  int(CEF_CALLBACK* set_point)(struct _cef_translator_test_t* self,
                               const cef_point_t* val);

  ///
  // Return a point value by out-param.
  ///
  void(CEF_CALLBACK* get_point_by_ref)(struct _cef_translator_test_t* self,
                                       cef_point_t* val);

  ///
  // Set a point list vlaue.
  ///
  int(CEF_CALLBACK* set_point_list)(struct _cef_translator_test_t* self,
                                    size_t valCount,
                                    cef_point_t const* val);

  ///
  // Return a point list value by out-param.
  ///
  int(CEF_CALLBACK* get_point_list_by_ref)(struct _cef_translator_test_t* self,
                                           size_t* valCount,
                                           cef_point_t* val);

  ///
  // Return the number of points that will be output above.
  ///
  size_t(CEF_CALLBACK* get_point_list_size)(
      struct _cef_translator_test_t* self);

  // LIBRARY-SIDE REFPTR VALUES

  ///
  // Return an new library-side object.
  ///
  struct _cef_translator_test_ref_ptr_library_t*(
      CEF_CALLBACK* get_ref_ptr_library)(struct _cef_translator_test_t* self,
                                         int val);

  ///
  // Set an object. Returns the value from
  // cef_translator_test_ref_ptr_library_t::get_value(). This tests input and
  // execution of a library-side object type.
  ///
  int(CEF_CALLBACK* set_ref_ptr_library)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_ref_ptr_library_t* val);

  ///
  // Set an object. Returns the object passed in. This tests input and output of
  // a library-side object type.
  ///
  struct _cef_translator_test_ref_ptr_library_t*(
      CEF_CALLBACK* set_ref_ptr_library_and_return)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_ref_ptr_library_t* val);

  ///
  // Set a child object. Returns the value from
  // cef_translator_test_ref_ptr_library_t::get_value(). This tests input of a
  // library- side child object type and execution as the parent type.
  ///
  int(CEF_CALLBACK* set_child_ref_ptr_library)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_ref_ptr_library_child_t* val);

  ///
  // Set a child object. Returns the object as the parent type. This tests input
  // of a library-side child object type and return as the parent type.
  ///
  struct _cef_translator_test_ref_ptr_library_t*(
      CEF_CALLBACK* set_child_ref_ptr_library_and_return_parent)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_ref_ptr_library_child_t* val);

  ///
  // Set an object list vlaue.
  ///
  int(CEF_CALLBACK* set_ref_ptr_library_list)(
      struct _cef_translator_test_t* self,
      size_t valCount,
      struct _cef_translator_test_ref_ptr_library_t* const* val,
      int val1,
      int val2);

  ///
  // Return an object list value by out-param.
  ///
  int(CEF_CALLBACK* get_ref_ptr_library_list_by_ref)(
      struct _cef_translator_test_t* self,
      size_t* valCount,
      struct _cef_translator_test_ref_ptr_library_t** val,
      int val1,
      int val2);

  ///
  // Return the number of object that will be output above.
  ///
  size_t(CEF_CALLBACK* get_ref_ptr_library_list_size)(
      struct _cef_translator_test_t* self);

  // CLIENT-SIDE REFPTR VALUES

  ///
  // Set an object. Returns the value from
  // cef_translator_test_ref_ptr_client_t::get_value(). This tests input and
  // execution of a client-side object type.
  ///
  int(CEF_CALLBACK* set_ref_ptr_client)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_ref_ptr_client_t* val);

  ///
  // Set an object. Returns the handler passed in. This tests input and output
  // of a client-side object type.
  ///
  struct _cef_translator_test_ref_ptr_client_t*(
      CEF_CALLBACK* set_ref_ptr_client_and_return)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_ref_ptr_client_t* val);

  ///
  // Set a child object. Returns the value from
  // cef_translator_test_ref_ptr_client_t::get_value(). This tests input of a
  // client- side child object type and execution as the parent type.
  ///
  int(CEF_CALLBACK* set_child_ref_ptr_client)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_ref_ptr_client_child_t* val);

  ///
  // Set a child object. Returns the object as the parent type. This tests input
  // of a client-side child object type and return as the parent type.
  ///
  struct _cef_translator_test_ref_ptr_client_t*(
      CEF_CALLBACK* set_child_ref_ptr_client_and_return_parent)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_ref_ptr_client_child_t* val);

  ///
  // Set an object list vlaue.
  ///
  int(CEF_CALLBACK* set_ref_ptr_client_list)(
      struct _cef_translator_test_t* self,
      size_t valCount,
      struct _cef_translator_test_ref_ptr_client_t* const* val,
      int val1,
      int val2);

  ///
  // Return an object list value by out-param.
  ///
  int(CEF_CALLBACK* get_ref_ptr_client_list_by_ref)(
      struct _cef_translator_test_t* self,
      size_t* valCount,
      struct _cef_translator_test_ref_ptr_client_t** val,
      struct _cef_translator_test_ref_ptr_client_t* val1,
      struct _cef_translator_test_ref_ptr_client_t* val2);

  ///
  // Return the number of object that will be output above.
  ///
  size_t(CEF_CALLBACK* get_ref_ptr_client_list_size)(
      struct _cef_translator_test_t* self);

  // LIBRARY-SIDE OWNPTR VALUES

  ///
  // Return an new library-side object.
  ///
  struct _cef_translator_test_scoped_library_t*(
      CEF_CALLBACK* get_own_ptr_library)(struct _cef_translator_test_t* self,
                                         int val);

  ///
  // Set an object. Returns the value from
  // cef_translator_test_scoped_library_t::get_value(). This tests input and
  // execution of a library-side object type.
  ///
  int(CEF_CALLBACK* set_own_ptr_library)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_library_t* val);

  ///
  // Set an object. Returns the object passed in. This tests input and output of
  // a library-side object type.
  ///
  struct _cef_translator_test_scoped_library_t*(
      CEF_CALLBACK* set_own_ptr_library_and_return)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_library_t* val);

  ///
  // Set a child object. Returns the value from
  // cef_translator_test_scoped_library_t::get_value(). This tests input of a
  // library- side child object type and execution as the parent type.
  ///
  int(CEF_CALLBACK* set_child_own_ptr_library)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_library_child_t* val);

  ///
  // Set a child object. Returns the object as the parent type. This tests input
  // of a library-side child object type and return as the parent type.
  ///
  struct _cef_translator_test_scoped_library_t*(
      CEF_CALLBACK* set_child_own_ptr_library_and_return_parent)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_library_child_t* val);

  // CLIENT-SIDE OWNPTR VALUES

  ///
  // Set an object. Returns the value from
  // cef_translator_test_scoped_client_t::get_value(). This tests input and
  // execution of a client-side object type.
  ///
  int(CEF_CALLBACK* set_own_ptr_client)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_client_t* val);

  ///
  // Set an object. Returns the handler passed in. This tests input and output
  // of a client-side object type.
  ///
  struct _cef_translator_test_scoped_client_t*(
      CEF_CALLBACK* set_own_ptr_client_and_return)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_client_t* val);

  ///
  // Set a child object. Returns the value from
  // cef_translator_test_scoped_client_t::get_value(). This tests input of a
  // client- side child object type and execution as the parent type.
  ///
  int(CEF_CALLBACK* set_child_own_ptr_client)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_client_child_t* val);

  ///
  // Set a child object. Returns the object as the parent type. This tests input
  // of a client-side child object type and return as the parent type.
  ///
  struct _cef_translator_test_scoped_client_t*(
      CEF_CALLBACK* set_child_own_ptr_client_and_return_parent)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_client_child_t* val);

  // LIBRARY-SIDE RAWPTR VALUES

  ///
  // Set an object. Returns the value from
  // cef_translator_test_scoped_library_t::get_value(). This tests input and
  // execution of a library-side object type.
  ///
  int(CEF_CALLBACK* set_raw_ptr_library)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_library_t* val);

  ///
  // Set a child object. Returns the value from
  // cef_translator_test_scoped_library_t::get_value(). This tests input of a
  // library- side child object type and execution as the parent type.
  ///
  int(CEF_CALLBACK* set_child_raw_ptr_library)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_library_child_t* val);

  ///
  // Set an object list vlaue.
  ///
  int(CEF_CALLBACK* set_raw_ptr_library_list)(
      struct _cef_translator_test_t* self,
      size_t valCount,
      struct _cef_translator_test_scoped_library_t* const* val,
      int val1,
      int val2);

  // CLIENT-SIDE RAWPTR VALUES

  ///
  // Set an object. Returns the value from
  // cef_translator_test_scoped_client_t::get_value(). This tests input and
  // execution of a client-side object type.
  ///
  int(CEF_CALLBACK* set_raw_ptr_client)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_client_t* val);

  ///
  // Set a child object. Returns the value from
  // cef_translator_test_scoped_client_t::get_value(). This tests input of a
  // client- side child object type and execution as the parent type.
  ///
  int(CEF_CALLBACK* set_child_raw_ptr_client)(
      struct _cef_translator_test_t* self,
      struct _cef_translator_test_scoped_client_child_t* val);

  ///
  // Set an object list vlaue.
  ///
  int(CEF_CALLBACK* set_raw_ptr_client_list)(
      struct _cef_translator_test_t* self,
      size_t valCount,
      struct _cef_translator_test_scoped_client_t* const* val,
      int val1,
      int val2);
} cef_translator_test_t;

///
// Create the test object.
///
CEF_EXPORT cef_translator_test_t* cef_translator_test_create();

///
// Library-side test object for RefPtr.
///
typedef struct _cef_translator_test_ref_ptr_library_t {
  ///
  // Base structure.
  ///
  cef_base_ref_counted_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_value)(
      struct _cef_translator_test_ref_ptr_library_t* self);

  ///
  // Set a value.
  ///
  void(CEF_CALLBACK* set_value)(
      struct _cef_translator_test_ref_ptr_library_t* self,
      int value);
} cef_translator_test_ref_ptr_library_t;

///
// Create the test object.
///
CEF_EXPORT cef_translator_test_ref_ptr_library_t*
cef_translator_test_ref_ptr_library_create(int value);

///
// Library-side child test object for RefPtr.
///
typedef struct _cef_translator_test_ref_ptr_library_child_t {
  ///
  // Base structure.
  ///
  cef_translator_test_ref_ptr_library_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_other_value)(
      struct _cef_translator_test_ref_ptr_library_child_t* self);

  ///
  // Set a value.
  ///
  void(CEF_CALLBACK* set_other_value)(
      struct _cef_translator_test_ref_ptr_library_child_t* self,
      int value);
} cef_translator_test_ref_ptr_library_child_t;

///
// Create the test object.
///
CEF_EXPORT cef_translator_test_ref_ptr_library_child_t*
cef_translator_test_ref_ptr_library_child_create(int value, int other_value);

///
// Another library-side child test object for RefPtr.
///
typedef struct _cef_translator_test_ref_ptr_library_child_child_t {
  ///
  // Base structure.
  ///
  cef_translator_test_ref_ptr_library_child_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_other_other_value)(
      struct _cef_translator_test_ref_ptr_library_child_child_t* self);

  ///
  // Set a value.
  ///
  void(CEF_CALLBACK* set_other_other_value)(
      struct _cef_translator_test_ref_ptr_library_child_child_t* self,
      int value);
} cef_translator_test_ref_ptr_library_child_child_t;

///
// Create the test object.
///
CEF_EXPORT cef_translator_test_ref_ptr_library_child_child_t*
cef_translator_test_ref_ptr_library_child_child_create(int value,
                                                       int other_value,
                                                       int other_other_value);

///
// Client-side test object for RefPtr.
///
typedef struct _cef_translator_test_ref_ptr_client_t {
  ///
  // Base structure.
  ///
  cef_base_ref_counted_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_value)(
      struct _cef_translator_test_ref_ptr_client_t* self);
} cef_translator_test_ref_ptr_client_t;

///
// Client-side child test object for RefPtr.
///
typedef struct _cef_translator_test_ref_ptr_client_child_t {
  ///
  // Base structure.
  ///
  cef_translator_test_ref_ptr_client_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_other_value)(
      struct _cef_translator_test_ref_ptr_client_child_t* self);
} cef_translator_test_ref_ptr_client_child_t;

///
// Library-side test object for OwnPtr/RawPtr.
///
typedef struct _cef_translator_test_scoped_library_t {
  ///
  // Base structure.
  ///
  cef_base_scoped_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_value)(
      struct _cef_translator_test_scoped_library_t* self);

  ///
  // Set a value.
  ///
  void(CEF_CALLBACK* set_value)(
      struct _cef_translator_test_scoped_library_t* self,
      int value);
} cef_translator_test_scoped_library_t;

///
// Create the test object.
///
CEF_EXPORT cef_translator_test_scoped_library_t*
cef_translator_test_scoped_library_create(int value);

///
// Library-side child test object for OwnPtr/RawPtr.
///
typedef struct _cef_translator_test_scoped_library_child_t {
  ///
  // Base structure.
  ///
  cef_translator_test_scoped_library_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_other_value)(
      struct _cef_translator_test_scoped_library_child_t* self);

  ///
  // Set a value.
  ///
  void(CEF_CALLBACK* set_other_value)(
      struct _cef_translator_test_scoped_library_child_t* self,
      int value);
} cef_translator_test_scoped_library_child_t;

///
// Create the test object.
///
CEF_EXPORT cef_translator_test_scoped_library_child_t*
cef_translator_test_scoped_library_child_create(int value, int other_value);

///
// Another library-side child test object for OwnPtr/RawPtr.
///
typedef struct _cef_translator_test_scoped_library_child_child_t {
  ///
  // Base structure.
  ///
  cef_translator_test_scoped_library_child_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_other_other_value)(
      struct _cef_translator_test_scoped_library_child_child_t* self);

  ///
  // Set a value.
  ///
  void(CEF_CALLBACK* set_other_other_value)(
      struct _cef_translator_test_scoped_library_child_child_t* self,
      int value);
} cef_translator_test_scoped_library_child_child_t;

///
// Create the test object.
///
CEF_EXPORT cef_translator_test_scoped_library_child_child_t*
cef_translator_test_scoped_library_child_child_create(int value,
                                                      int other_value,
                                                      int other_other_value);

///
// Client-side test object for OwnPtr/RawPtr.
///
typedef struct _cef_translator_test_scoped_client_t {
  ///
  // Base structure.
  ///
  cef_base_scoped_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_value)(
      struct _cef_translator_test_scoped_client_t* self);
} cef_translator_test_scoped_client_t;

///
// Client-side child test object for OwnPtr/RawPtr.
///
typedef struct _cef_translator_test_scoped_client_child_t {
  ///
  // Base structure.
  ///
  cef_translator_test_scoped_client_t base;

  ///
  // Return a value.
  ///
  int(CEF_CALLBACK* get_other_value)(
      struct _cef_translator_test_scoped_client_child_t* self);
} cef_translator_test_scoped_client_child_t;

#ifdef __cplusplus
}
#endif

#endif  // CEF_INCLUDE_CAPI_TEST_CEF_TRANSLATOR_TEST_CAPI_H_
