зеркало из https://github.com/microsoft/cppwinrt.git
525 строки
13 KiB
C++
525 строки
13 KiB
C++
#include "pch.h"
|
|
#include "Class.h"
|
|
#include "Class.g.cpp"
|
|
|
|
namespace winrt::test_component::implementation
|
|
{
|
|
using namespace Windows::Foundation;
|
|
|
|
struct Value : implements<Value, IStringable>
|
|
{
|
|
Value(int32_t value) :
|
|
m_value(value)
|
|
{
|
|
}
|
|
|
|
hstring ToString()
|
|
{
|
|
return hstring{ std::to_wstring(m_value) };
|
|
}
|
|
|
|
private:
|
|
|
|
int32_t m_value{};
|
|
};
|
|
|
|
hstring Class::InInt32(int32_t value)
|
|
{
|
|
return hstring{ std::to_wstring(value) };
|
|
}
|
|
|
|
hstring Class::InString(hstring const& value)
|
|
{
|
|
return value;
|
|
}
|
|
|
|
hstring Class::InObject(Windows::Foundation::IInspectable const& value)
|
|
{
|
|
return value.as<IStringable>().ToString();
|
|
}
|
|
|
|
hstring Class::InStringable(Windows::Foundation::IStringable const& value)
|
|
{
|
|
return value.ToString();
|
|
}
|
|
|
|
hstring Class::InStruct(Struct const& value)
|
|
{
|
|
return value.First + value.Second;
|
|
}
|
|
|
|
hstring Class::InStructRef(Struct const& value)
|
|
{
|
|
return value.First + value.Second + L"ref";
|
|
}
|
|
|
|
hstring Class::InEnum(Signed const& value)
|
|
{
|
|
switch (value)
|
|
{
|
|
case Signed::First: return L"First";
|
|
case Signed::Second: return L"Second";
|
|
case Signed::Third: return L"Third";
|
|
}
|
|
|
|
throw hresult_invalid_argument();
|
|
}
|
|
|
|
Class::Class(Windows::Foundation::Collections::IIterable<hstring> const& arg, int32_t)
|
|
{
|
|
if (arg.First().Current() != L"test")
|
|
{
|
|
throw hresult_error();
|
|
}
|
|
}
|
|
Class::Class(Windows::Foundation::Collections::IIterable<Windows::Foundation::Collections::IKeyValuePair<hstring, hstring>> const& arg, int32_t, int32_t)
|
|
{
|
|
if (arg.First().Current().Key() != L"test")
|
|
{
|
|
throw hresult_error();
|
|
}
|
|
}
|
|
Class::Class(Windows::Foundation::Collections::IMap<hstring, hstring> const& arg, int32_t, int32_t, int32_t)
|
|
{
|
|
if (arg.Lookup(L"test") != L"test")
|
|
{
|
|
throw hresult_error();
|
|
}
|
|
}
|
|
Class::Class(Windows::Foundation::Collections::IMapView<hstring, hstring> const& arg, int32_t, int32_t, int32_t, int32_t)
|
|
{
|
|
if (arg.Lookup(L"test") != L"test")
|
|
{
|
|
throw hresult_error();
|
|
}
|
|
}
|
|
Class::Class(Windows::Foundation::Collections::IVector<hstring> const& arg, int32_t, int32_t, int32_t, int32_t, int32_t)
|
|
{
|
|
if (arg.GetAt(0) != L"test")
|
|
{
|
|
throw hresult_error();
|
|
}
|
|
}
|
|
Class::Class(Windows::Foundation::Collections::IVectorView<hstring> const& arg, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t)
|
|
{
|
|
if (arg.GetAt(0) != L"test")
|
|
{
|
|
throw hresult_error();
|
|
}
|
|
}
|
|
|
|
hstring Class::InIterable(Windows::Foundation::Collections::IIterable<hstring> const& value)
|
|
{
|
|
return value.First().Current();
|
|
}
|
|
hstring Class::InIterablePair(Windows::Foundation::Collections::IIterable<Windows::Foundation::Collections::IKeyValuePair<hstring, hstring>> const& value)
|
|
{
|
|
return value.First().Current().Key();
|
|
}
|
|
Windows::Foundation::IAsyncOperation<hstring> Class::InAsyncIterable(Windows::Foundation::Collections::IIterable<hstring> value)
|
|
{
|
|
co_return value.First().Current();
|
|
}
|
|
Windows::Foundation::IAsyncOperation<hstring> Class::InAsyncIterablePair(Windows::Foundation::Collections::IIterable<Windows::Foundation::Collections::IKeyValuePair<hstring, hstring>> value)
|
|
{
|
|
co_return value.First().Current().Key();
|
|
}
|
|
hstring Class::InMap(Windows::Foundation::Collections::IMap<hstring, hstring> const& value)
|
|
{
|
|
return value.Lookup(L"test");
|
|
}
|
|
hstring Class::InMapView(Windows::Foundation::Collections::IMapView<hstring, hstring> const& value)
|
|
{
|
|
return value.Lookup(L"test");
|
|
}
|
|
Windows::Foundation::IAsyncOperation<hstring> Class::InAsyncMapView(Windows::Foundation::Collections::IMapView<hstring, hstring> value)
|
|
{
|
|
co_return value.Lookup(L"test");
|
|
}
|
|
hstring Class::InVector(Windows::Foundation::Collections::IVector<hstring> const& value)
|
|
{
|
|
return value.GetAt(0);
|
|
}
|
|
hstring Class::InVectorView(Windows::Foundation::Collections::IVectorView<hstring> const& value)
|
|
{
|
|
return value.GetAt(0);
|
|
}
|
|
Windows::Foundation::IAsyncOperation<hstring> Class::InAsyncVectorView(Windows::Foundation::Collections::IVectorView<hstring> value)
|
|
{
|
|
co_return value.GetAt(0);
|
|
}
|
|
|
|
void Class::OutInt32(int32_t& value)
|
|
{
|
|
value = 123;
|
|
}
|
|
|
|
void Class::OutString(hstring& value)
|
|
{
|
|
value = L"123";
|
|
}
|
|
|
|
void Class::OutObject(Windows::Foundation::IInspectable& value)
|
|
{
|
|
value = make<Value>(123);
|
|
}
|
|
|
|
void Class::OutStringable(Windows::Foundation::IStringable& value)
|
|
{
|
|
value = make<Value>(123);
|
|
}
|
|
|
|
void Class::OutStruct(Struct& value)
|
|
{
|
|
value.First = L"1";
|
|
value.Second = L"2";
|
|
}
|
|
|
|
void Class::OutEnum(Signed& value)
|
|
{
|
|
value = Signed::First;
|
|
}
|
|
|
|
int32_t Class::ReturnInt32()
|
|
{
|
|
return 123;
|
|
}
|
|
hstring Class::ReturnString()
|
|
{
|
|
return L"123";
|
|
}
|
|
Windows::Foundation::IInspectable Class::ReturnObject()
|
|
{
|
|
return make<Value>(123);
|
|
}
|
|
Windows::Foundation::IStringable Class::ReturnStringable()
|
|
{
|
|
return make<Value>(123);
|
|
}
|
|
Struct Class::ReturnStruct()
|
|
{
|
|
return { L"1", L"2" };
|
|
}
|
|
Signed Class::ReturnEnum()
|
|
{
|
|
return Signed::First;
|
|
}
|
|
|
|
hstring Class::InInt32Array(array_view<int32_t const> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
hstring result;
|
|
|
|
for (auto&& v : value)
|
|
{
|
|
result = result + std::to_wstring(v);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
hstring Class::InStringArray(array_view<hstring const> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
hstring result;
|
|
|
|
for (auto&& v : value)
|
|
{
|
|
result = result + v;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
hstring Class::InObjectArray(array_view<Windows::Foundation::IInspectable const> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
hstring result;
|
|
|
|
for (auto&& v : value)
|
|
{
|
|
result = result + v.as<IStringable>().ToString();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
hstring Class::InStringableArray(array_view<Windows::Foundation::IStringable const> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
hstring result;
|
|
|
|
for (auto&& v : value)
|
|
{
|
|
result = result + v.ToString();
|
|
}
|
|
|
|
return result;
|
|
}
|
|
hstring Class::InStructArray(array_view<Struct const> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
hstring result;
|
|
|
|
for (auto&& v : value)
|
|
{
|
|
result = result + v.First + v.Second;
|
|
}
|
|
|
|
return result;
|
|
}
|
|
hstring Class::InEnumArray(array_view<Signed const> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
hstring result;
|
|
|
|
for (auto&& v : value)
|
|
{
|
|
result = result + InEnum(v);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
void Class::OutInt32Array(com_array<int32_t>& value)
|
|
{
|
|
value = { 1,2,3 };
|
|
}
|
|
|
|
void Class::OutStringArray(com_array<hstring>& value)
|
|
{
|
|
value = { L"1", L"2", L"3" };
|
|
}
|
|
|
|
void Class::OutObjectArray(com_array<Windows::Foundation::IInspectable>& value)
|
|
{
|
|
value = { make<Value>(1), make<Value>(2), make<Value>(3) };
|
|
}
|
|
|
|
void Class::OutStringableArray(com_array<Windows::Foundation::IStringable>& value)
|
|
{
|
|
value = { make<Value>(1), make<Value>(2), make<Value>(3) };
|
|
}
|
|
|
|
void Class::OutStructArray(com_array<Struct>& value)
|
|
{
|
|
value = { { L"1", L"2" }, { L"10", L"20" } };
|
|
}
|
|
|
|
void Class::OutEnumArray(com_array<Signed>& value)
|
|
{
|
|
value = { Signed::First, Signed::Second };
|
|
}
|
|
|
|
void Class::RefInt32Array(array_view<int32_t> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
if (value.size())
|
|
{
|
|
int32_t counter{};
|
|
|
|
std::generate(value.begin(), value.end() - 1, [&]
|
|
{
|
|
return ++counter;
|
|
});
|
|
}
|
|
}
|
|
|
|
void Class::RefStringArray(array_view<hstring> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
if (value.size())
|
|
{
|
|
int32_t counter{};
|
|
|
|
std::generate(value.begin(), value.end() - 1, [&]
|
|
{
|
|
return hstring{ std::to_wstring(++counter) };
|
|
});
|
|
}
|
|
}
|
|
|
|
void Class::RefObjectArray(array_view<Windows::Foundation::IInspectable> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
if (value.size())
|
|
{
|
|
int32_t counter{};
|
|
|
|
std::generate(value.begin(), value.end() - 1, [&]
|
|
{
|
|
return make<Value>(++counter);
|
|
});
|
|
}
|
|
}
|
|
|
|
void Class::RefStringableArray(array_view<Windows::Foundation::IStringable> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
if (value.size())
|
|
{
|
|
int32_t counter{};
|
|
|
|
std::generate(value.begin(), value.end() - 1, [&]
|
|
{
|
|
return make<Value>(++counter);
|
|
});
|
|
}
|
|
}
|
|
|
|
void Class::RefStructArray(array_view<Struct> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
if (value.size())
|
|
{
|
|
int32_t counter{};
|
|
|
|
std::generate(value.begin(), value.end() - 1, [&]
|
|
{
|
|
return Struct
|
|
{
|
|
hstring{ std::to_wstring(++counter) },
|
|
hstring{ std::to_wstring(++counter) }
|
|
};
|
|
});
|
|
}
|
|
}
|
|
|
|
void Class::RefEnumArray(array_view<Signed> value)
|
|
{
|
|
simulate_rpc_behavior(value);
|
|
|
|
if (value.size())
|
|
{
|
|
Signed counter{ Signed::First };
|
|
|
|
std::generate(value.begin(), value.end() - 1, [&]
|
|
{
|
|
auto result = counter;
|
|
counter = static_cast<Signed>(static_cast<int32_t>(counter) + 1);
|
|
return result;
|
|
});
|
|
}
|
|
}
|
|
|
|
com_array<int32_t> Class::ReturnInt32Array()
|
|
{
|
|
return { 1,2,3 };
|
|
}
|
|
|
|
com_array<hstring> Class::ReturnStringArray()
|
|
{
|
|
return { L"1", L"2", L"3" };
|
|
}
|
|
|
|
com_array<Windows::Foundation::IInspectable> Class::ReturnObjectArray()
|
|
{
|
|
return { make<Value>(1), make<Value>(2), make<Value>(3) };
|
|
}
|
|
|
|
com_array<Windows::Foundation::IStringable> Class::ReturnStringableArray()
|
|
{
|
|
return { make<Value>(1), make<Value>(2), make<Value>(3) };
|
|
}
|
|
|
|
com_array<Struct> Class::ReturnStructArray()
|
|
{
|
|
return { { L"1", L"2" }, { L"10", L"20" } };
|
|
}
|
|
|
|
com_array<Signed> Class::ReturnEnumArray()
|
|
{
|
|
return { Signed::First, Signed::Second };
|
|
}
|
|
|
|
void Class::NoexceptVoid() noexcept
|
|
{
|
|
}
|
|
|
|
int32_t Class::NoexceptInt32() noexcept
|
|
{
|
|
return 123;
|
|
}
|
|
|
|
hstring Class::NoexceptString() noexcept
|
|
{
|
|
return L"123";
|
|
}
|
|
|
|
event_token Class::DeferrableEvent(TypedEventHandler<test_component::Class, test_component::DeferrableEventArgs> const& handler)
|
|
{
|
|
return m_deferrableEvent.add(handler);
|
|
}
|
|
|
|
void Class::DeferrableEvent(event_token const& token)
|
|
{
|
|
return m_deferrableEvent.remove(token);
|
|
}
|
|
|
|
IAsyncOperation<int32_t> Class::RaiseDeferrableEventAsync()
|
|
{
|
|
auto args = make_self<DeferrableEventArgs>();
|
|
m_deferrableEvent(*this, *args);
|
|
co_await args->wait_for_deferrals();
|
|
co_return args->m_counter;
|
|
}
|
|
|
|
// This test validates that defining WINRT_NO_MAKE_DETECTION actually
|
|
// allows an implementation to be final and have a private destructor.
|
|
// This is *not* recommended as there are no safeguards for direct and
|
|
// invalid allocations, but is provided for compatibility.
|
|
|
|
bool Class::TestNoMakeDetection()
|
|
{
|
|
static bool Destroyed{};
|
|
|
|
struct Stringable final : implements<Stringable, IStringable>
|
|
{
|
|
hstring ToString()
|
|
{
|
|
return L"Stringable";
|
|
}
|
|
|
|
private:
|
|
|
|
~Stringable()
|
|
{
|
|
Destroyed = true;
|
|
}
|
|
};
|
|
|
|
bool pass = true;
|
|
|
|
{
|
|
Destroyed = false;
|
|
IStringable stringable{ (new Stringable())->get_abi<IStringable>(), take_ownership_from_abi };
|
|
pass = pass && !Destroyed;
|
|
|
|
stringable = nullptr;
|
|
pass = pass && Destroyed;
|
|
}
|
|
{
|
|
Destroyed = false;
|
|
IStringable stringable = make<Stringable>();
|
|
pass = pass && !Destroyed;
|
|
stringable = nullptr;
|
|
pass = pass && Destroyed;
|
|
}
|
|
return pass;
|
|
}
|
|
}
|
|
|
|
namespace
|
|
{
|
|
void ValidateStaticEventAutoRevoke() {
|
|
auto x = winrt::test_component::Simple::StaticEvent(winrt::auto_revoke, [](auto&&, auto&&) {});
|
|
}
|
|
} |