// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef IOS_CHROME_TEST_SWIFT_INTEROP_POINTER_UNIQUE_PTR_H_
#define IOS_CHROME_TEST_SWIFT_INTEROP_POINTER_UNIQUE_PTR_H_
#include <memory>
// As of Xcode 13.3, any C++ classes that contain a std::unique_ptr<T>
// fails to emit the definition to Swift, and use of the object in Swift
// results in an error: "cannot find 'T' in scope".
// https://github.com/apple/swift/issues/58639
#define SWIFT_INTEROP_UNIQUE_PTR_WORKS 0
class Value {
public:
Value(int value);
~Value();
bool IsValid();
int GetValue();
private:
int value_;
};
class ValueReturner {
public:
ValueReturner();
~ValueReturner();
// As of Swift 5.8, C++ methods that return pointers are not imported by
// default as they are an unsafe projection into the state of the object.
// Using clang hints, the APIs can be annotated to import anyway. These hints
// are backwards compatible to previous language versions.
__attribute__((swift_attr("import_unsafe"))) Value* ObjectPointer();
private:
#if SWIFT_INTEROP_UNIQUE_PTR_WORKS
std::unique_ptr<Value> object_;
#else
Value* object_;
#endif
};
#endif // IOS_CHROME_TEST_SWIFT_INTEROP_POINTER_UNIQUE_PTR_H_