Skip to content

Commit 667c45a

Browse files
[NFCI][SYCL] Consolidate [get|create]SyclObj[From]Impl into ImplUtils (#20798)
This way much less `friend` declarations are needed.
1 parent 041422f commit 667c45a

23 files changed

+100
-377
lines changed

sycl/include/sycl/accessor.hpp

Lines changed: 8 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,7 @@ using AccessorImplPtr = std::shared_ptr<AccessorImplHost>;
516516
class __SYCL_EXPORT AccessorBaseHost {
517517
protected:
518518
AccessorBaseHost(const AccessorImplPtr &Impl) : impl{Impl} {}
519+
friend sycl::detail::ImplUtils;
519520

520521
public:
521522
AccessorBaseHost(id<3> Offset, range<3> AccessRange, range<3> MemoryRange,
@@ -550,16 +551,6 @@ class __SYCL_EXPORT AccessorBaseHost {
550551

551552
void *getMemoryObject() const;
552553

553-
template <class Obj>
554-
friend const decltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObject);
555-
556-
template <class T>
557-
friend T detail::createSyclObjFromImpl(
558-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
559-
template <class T>
560-
friend T detail::createSyclObjFromImpl(
561-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
562-
563554
template <typename, int, access::mode, access::target, access::placeholder,
564555
typename>
565556
friend class accessor;
@@ -574,6 +565,8 @@ class LocalAccessorImplHost;
574565
using LocalAccessorImplPtr = std::shared_ptr<LocalAccessorImplHost>;
575566

576567
class __SYCL_EXPORT LocalAccessorBaseHost {
568+
friend sycl::detail::ImplUtils;
569+
577570
protected:
578571
LocalAccessorBaseHost(const LocalAccessorImplPtr &Impl) : impl{Impl} {}
579572

@@ -589,17 +582,6 @@ class __SYCL_EXPORT LocalAccessorBaseHost {
589582
const property_list &getPropList() const;
590583

591584
protected:
592-
template <class Obj>
593-
friend const decltype(Obj::impl) &
594-
detail::getSyclObjImpl(const Obj &SyclObject);
595-
596-
template <class T>
597-
friend T detail::createSyclObjFromImpl(
598-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
599-
template <class T>
600-
friend T detail::createSyclObjFromImpl(
601-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
602-
603585
LocalAccessorImplPtr impl;
604586
};
605587
} // namespace detail
@@ -623,6 +605,8 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
623605
public detail::OwnerLessBase<
624606
accessor<DataT, Dimensions, AccessMode, AccessTarget, IsPlaceholder,
625607
PropertyListT>> {
608+
friend sycl::detail::ImplUtils;
609+
626610
protected:
627611
static_assert((AccessTarget == access::target::global_buffer ||
628612
AccessTarget == access::target::constant_buffer ||
@@ -854,17 +838,6 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
854838
friend class sycl::stream;
855839
friend class sycl::ext::intel::esimd::detail::AccessorPrivateProxy;
856840

857-
template <class Obj>
858-
friend const decltype(Obj::impl) &
859-
detail::getSyclObjImpl(const Obj &SyclObject);
860-
861-
template <class T>
862-
friend T detail::createSyclObjFromImpl(
863-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
864-
template <class T>
865-
friend T detail::createSyclObjFromImpl(
866-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
867-
868841
public:
869842
// 4.7.6.9.1. Interface for buffer command accessors
870843
// value_type is defined as const DataT for read_only accessors, DataT
@@ -2249,17 +2222,6 @@ class __SYCL_SPECIAL_CLASS local_accessor_base :
22492222
return Result;
22502223
}
22512224

2252-
template <class Obj>
2253-
friend const decltype(Obj::impl) &
2254-
detail::getSyclObjImpl(const Obj &SyclObject);
2255-
2256-
template <class T>
2257-
friend T detail::createSyclObjFromImpl(
2258-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
2259-
template <class T>
2260-
friend T detail::createSyclObjFromImpl(
2261-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
2262-
22632225
template <typename DataT_, int Dimensions_> friend class local_accessor;
22642226

22652227
public:
@@ -2474,6 +2436,7 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor
24742436
access::placeholder::false_t>,
24752437
public detail::OwnerLessBase<local_accessor<DataT, Dimensions>> {
24762438

2439+
friend sycl::detail::ImplUtils;
24772440
using local_acc =
24782441
local_accessor_base<DataT, Dimensions,
24792442
detail::accessModeFromConstness<DataT>(),
@@ -2647,6 +2610,8 @@ template <typename DataT, int Dimensions = 1,
26472610
class __SYCL_EBO host_accessor
26482611
: public accessor<DataT, Dimensions, AccessMode, target::host_buffer,
26492612
access::placeholder::false_t> {
2613+
friend sycl::detail::ImplUtils;
2614+
26502615
protected:
26512616
using AccessorT = accessor<DataT, Dimensions, AccessMode, target::host_buffer,
26522617
access::placeholder::false_t>;
@@ -2671,16 +2636,6 @@ class __SYCL_EBO host_accessor
26712636
host_accessor(const detail::AccessorImplPtr &Impl)
26722637
: accessor<DataT, Dimensions, AccessMode, target::host_buffer,
26732638
access::placeholder::false_t>{Impl} {}
2674-
2675-
template <class Obj>
2676-
friend const decltype(Obj::impl) &getSyclObjImpl(const Obj &SyclObject);
2677-
2678-
template <class T>
2679-
friend T detail::createSyclObjFromImpl(
2680-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
2681-
template <class T>
2682-
friend T detail::createSyclObjFromImpl(
2683-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
26842639
#endif // __SYCL_DEVICE_ONLY__
26852640

26862641
public:

sycl/include/sycl/accessor_image.hpp

Lines changed: 6 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ class __SYCL_EXPORT UnsampledImageAccessorBaseHost {
7777
protected:
7878
UnsampledImageAccessorBaseHost(const UnsampledImageAccessorImplPtr &Impl)
7979
: impl{Impl} {}
80+
friend sycl::detail::ImplUtils;
8081

8182
public:
8283
UnsampledImageAccessorBaseHost(sycl::range<3> Size, access_mode AccessMode,
@@ -97,18 +98,6 @@ class __SYCL_EXPORT UnsampledImageAccessorBaseHost {
9798
const property_list &getPropList() const;
9899

99100
protected:
100-
template <class Obj>
101-
friend const decltype(Obj::impl) &
102-
detail::getSyclObjImpl(const Obj &SyclObject);
103-
104-
template <class T>
105-
friend T detail::createSyclObjFromImpl(
106-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
107-
108-
template <class T>
109-
friend T detail::createSyclObjFromImpl(
110-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
111-
112101
UnsampledImageAccessorImplPtr impl;
113102

114103
// The function references helper methods required by GDB pretty-printers
@@ -151,6 +140,7 @@ class __SYCL_EXPORT SampledImageAccessorBaseHost {
151140
protected:
152141
SampledImageAccessorBaseHost(const SampledImageAccessorImplPtr &Impl)
153142
: impl{Impl} {}
143+
friend sycl::detail::ImplUtils;
154144

155145
public:
156146
SampledImageAccessorBaseHost(sycl::range<3> Size, void *SYCLMemObject,
@@ -173,18 +163,6 @@ class __SYCL_EXPORT SampledImageAccessorBaseHost {
173163
const property_list &getPropList() const;
174164

175165
protected:
176-
template <class Obj>
177-
friend const decltype(Obj::impl) &
178-
detail::getSyclObjImpl(const Obj &SyclObject);
179-
180-
template <class T>
181-
friend T detail::createSyclObjFromImpl(
182-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
183-
184-
template <class T>
185-
friend T detail::createSyclObjFromImpl(
186-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
187-
188166
SampledImageAccessorImplPtr impl;
189167

190168
// The function references helper methods required by GDB pretty-printers
@@ -789,6 +767,7 @@ class __SYCL_EBO unsampled_image_accessor :
789767
#endif // __SYCL_DEVICE_ONLY__
790768
public detail::OwnerLessBase<
791769
unsampled_image_accessor<DataT, Dimensions, AccessMode, AccessTarget>> {
770+
friend sycl::detail::ImplUtils;
792771
static_assert(std::is_same_v<DataT, int4> || std::is_same_v<DataT, uint4> ||
793772
std::is_same_v<DataT, float4> ||
794773
std::is_same_v<DataT, half4>,
@@ -940,18 +919,6 @@ class __SYCL_EBO unsampled_image_accessor :
940919
{
941920
(void)Impl;
942921
}
943-
944-
template <class Obj>
945-
friend const decltype(Obj::impl) &
946-
detail::getSyclObjImpl(const Obj &SyclObject);
947-
948-
template <class T>
949-
friend T detail::createSyclObjFromImpl(
950-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
951-
952-
template <class T>
953-
friend T detail::createSyclObjFromImpl(
954-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
955922
};
956923

957924
template <typename DataT, int Dimensions = 1,
@@ -962,6 +929,7 @@ class __SYCL_EBO host_unsampled_image_accessor
962929
: private detail::UnsampledImageAccessorBaseHost,
963930
public detail::OwnerLessBase<
964931
host_unsampled_image_accessor<DataT, Dimensions, AccessMode>> {
932+
friend sycl::detail::ImplUtils;
965933
static_assert(std::is_same_v<DataT, int4> || std::is_same_v<DataT, uint4> ||
966934
std::is_same_v<DataT, float4> ||
967935
std::is_same_v<DataT, half4>,
@@ -1082,18 +1050,6 @@ class __SYCL_EBO host_unsampled_image_accessor
10821050
host_unsampled_image_accessor(
10831051
const detail::UnsampledImageAccessorImplPtr &Impl)
10841052
: base_class{Impl} {}
1085-
1086-
template <class Obj>
1087-
friend const decltype(Obj::impl) &
1088-
detail::getSyclObjImpl(const Obj &SyclObject);
1089-
1090-
template <class T>
1091-
friend T detail::createSyclObjFromImpl(
1092-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1093-
1094-
template <class T>
1095-
friend T detail::createSyclObjFromImpl(
1096-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
10971053
};
10981054

10991055
template <typename DataT, int Dimensions,
@@ -1104,6 +1060,7 @@ class __SYCL_EBO sampled_image_accessor :
11041060
#endif // __SYCL_DEVICE_ONLY__
11051061
public detail::OwnerLessBase<
11061062
sampled_image_accessor<DataT, Dimensions, AccessTarget>> {
1063+
friend sycl::detail::ImplUtils;
11071064
static_assert(std::is_same_v<DataT, int4> || std::is_same_v<DataT, uint4> ||
11081065
std::is_same_v<DataT, float4> ||
11091066
std::is_same_v<DataT, half4>,
@@ -1231,25 +1188,14 @@ class __SYCL_EBO sampled_image_accessor :
12311188
{
12321189
(void)Impl;
12331190
}
1234-
1235-
template <class Obj>
1236-
friend const decltype(Obj::impl) &
1237-
detail::getSyclObjImpl(const Obj &SyclObject);
1238-
1239-
template <class T>
1240-
friend T detail::createSyclObjFromImpl(
1241-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1242-
1243-
template <class T>
1244-
friend T detail::createSyclObjFromImpl(
1245-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
12461191
};
12471192

12481193
template <typename DataT, int Dimensions>
12491194
class __SYCL_EBO host_sampled_image_accessor
12501195
: private detail::SampledImageAccessorBaseHost,
12511196
public detail::OwnerLessBase<
12521197
host_sampled_image_accessor<DataT, Dimensions>> {
1198+
friend sycl::detail::ImplUtils;
12531199
static_assert(std::is_same_v<DataT, int4> || std::is_same_v<DataT, uint4> ||
12541200
std::is_same_v<DataT, float4> ||
12551201
std::is_same_v<DataT, half4>,
@@ -1340,18 +1286,6 @@ class __SYCL_EBO host_sampled_image_accessor
13401286
private:
13411287
host_sampled_image_accessor(const detail::SampledImageAccessorImplPtr &Impl)
13421288
: base_class{Impl} {}
1343-
1344-
template <class Obj>
1345-
friend const decltype(Obj::impl) &
1346-
detail::getSyclObjImpl(const Obj &SyclObject);
1347-
1348-
template <class T>
1349-
friend T detail::createSyclObjFromImpl(
1350-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
1351-
1352-
template <class T>
1353-
friend T detail::createSyclObjFromImpl(
1354-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
13551289
};
13561290

13571291
} // namespace _V1

sycl/include/sycl/buffer.hpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,8 @@ struct BufferInterop;
9393

9494
// The non-template base for the sycl::buffer class
9595
class __SYCL_EXPORT buffer_plain {
96+
friend sycl::detail::ImplUtils;
97+
9698
protected:
9799
buffer_plain(size_t SizeInBytes, size_t, const property_list &Props,
98100
std::unique_ptr<detail::SYCLMemObjAllocator> Allocator);
@@ -730,9 +732,6 @@ class buffer : public detail::buffer_plain,
730732
}
731733

732734
private:
733-
template <class Obj>
734-
friend const decltype(Obj::impl) &
735-
detail::getSyclObjImpl(const Obj &SyclObject);
736735
template <typename A, int dims, typename C, typename Enable>
737736
friend class buffer;
738737
template <typename DataT, int dims, access::mode mode, access::target target,

sycl/include/sycl/context.hpp

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ auto get_native(const SyclT &Obj) -> backend_return_t<Backend, SyclT>;
5151
///
5252
/// \ingroup sycl_api
5353
class __SYCL_EXPORT context : public detail::OwnerLessBase<context> {
54+
friend sycl::detail::ImplUtils;
55+
5456
public:
5557
/// Constructs a SYCL context instance using an instance of default_selector.
5658
///
@@ -255,17 +257,6 @@ class __SYCL_EXPORT context : public detail::OwnerLessBase<context> {
255257
template <backend Backend, class SyclT>
256258
friend auto get_native(const SyclT &Obj) -> backend_return_t<Backend, SyclT>;
257259

258-
template <class Obj>
259-
friend const decltype(Obj::impl) &
260-
detail::getSyclObjImpl(const Obj &SyclObject);
261-
262-
template <class T>
263-
friend T detail::createSyclObjFromImpl(
264-
std::add_rvalue_reference_t<decltype(T::impl)> ImplObj);
265-
template <class T>
266-
friend T detail::createSyclObjFromImpl(
267-
std::add_lvalue_reference_t<const decltype(T::impl)> ImplObj);
268-
269260
const property_list &getPropList() const;
270261
};
271262

0 commit comments

Comments
 (0)