1#pragma once
2#include <sdbusplus/async/client.hpp>
3#include <type_traits>
4
5% for h in interface.cpp_includes():
6#include <${h}>
7% endfor
8#include <${interface.headerFile("common")}>
9
10#ifndef SDBUSPP_REMOVE_DEPRECATED_NAMESPACE
11namespace sdbusplus::${interface.old_cppNamespacedClass("client")}
12{
13
14constexpr auto interface =
15    sdbusplus::common::${interface.cppNamespacedClass()}::interface;
16
17} // namespace sdbusplus::${interface.old_cppNamespacedClass("client")}
18#endif
19
20namespace sdbusplus::client::${interface.cppNamespace()}
21{
22
23namespace details
24{
25
26template <typename Proxy>
27class ${interface.classname} :
28    public sdbusplus::common::${interface.cppNamespacedClass()}
29{
30  public:
31    template <bool S, bool P, bool Preserved,
32              template <typename> typename... Types>
33    friend class sdbusplus::async::client::client;
34    // Delete default constructor as these should only be constructed
35    // indirectly through sdbusplus::async::client_t.
36    ${interface.classname}() = delete;
37
38    % for m in interface.methods:
39${m.render(loader, "method.client.hpp.mako", method=m, interface=interface)}
40    % endfor
41    % for p in interface.properties:
42${p.render(loader, "property.client.hpp.mako", property=p, interface=interface)}
43    % endfor
44  private:
45    // Conversion constructor from proxy used by client_t.
46    constexpr ${interface.classname}(sdbusplus::async::context& ctx, Proxy p) :
47        ctx(ctx), proxy(p.interface(interface)) {}
48
49    sdbusplus::async::context& ctx{};
50    decltype(std::declval<Proxy>().interface(interface)) proxy = {};
51};
52
53} // namespace details
54
55/** Alias class so we can use the client in both a client_t aggregation
56 *  and individually.
57 *
58 *  sdbusplus::async::client_t<${interface.classname}>() or
59 *  ${interface.classname}() both construct an equivalent instance.
60 */
61template <typename Proxy = void>
62struct ${interface.classname} : public
63    std::conditional_t<
64        std::is_void_v<Proxy>,
65        sdbusplus::async::client_t<details::${interface.classname}>,
66        details::${interface.classname}<Proxy>>
67{
68    template <typename... Args>
69    ${interface.classname}(Args&&... args) :
70        std::conditional_t<std::is_void_v<Proxy>,
71                           sdbusplus::async::client_t<details::${interface.classname}>,
72                           details::${interface.classname}<Proxy>>(
73            std::forward<Args>(args)...)
74    {}
75};
76
77} // namespace sdbusplus::client::${interface.cppNamespacedClass()}
78