Skip to content

Commit a66a6ad

Browse files
committed
feat(java): ref<> and object<> redesign
Added: ref<> now fully supports incomplete element_type. Among other things, this improves compilation speed x10 with new Java API generated headers (version 2.0), which forward declare parameter types, instead of including full definitions. Fixed: ref<> now supports all type conversions allowed by corresponding Java types, including array conversions. This also works for converting between generated and manually defined element types: ref<java::lang::RuntimeException> e; // generated ref<java::lang::Throwable> e2 = e; // generated ref<throwable> e3 = e; // manually defined
1 parent 72f3c33 commit a66a6ad

33 files changed

Lines changed: 839 additions & 523 deletions

‎source/scapix/bridge/java/object.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class bridge : public link::java::object<SCAPIX_META_STRING("com/scapix/Bridge")
3939

4040
protected:
4141

42-
bridge(handle_type h) : object_type(h) {}
42+
bridge(handle_type h) : object(h) {}
4343

4444
};
4545

@@ -57,7 +57,7 @@ class function : public link::java::object<SCAPIX_META_STRING("com/scapix/Functi
5757

5858
protected:
5959

60-
function(handle_type h) : object_type(h) {}
60+
function(handle_type h) : object(h) {}
6161

6262
};
6363

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
/*
2+
scapix/detail/warning/pop.h
3+
4+
Copyright (c) 2019-2023 Boris Rasin (boris@scapix.com)
5+
*/
6+
7+
#if defined(_MSC_VER)
8+
#pragma warning(push)
9+
#pragma warning(disable: 4584) // 'class1' : base-class 'class2' is already a base-class of 'class3'
10+
#endif
11+
12+
#if defined(__GNUG__) || defined(__clang__)
13+
#pragma GCC diagnostic push
14+
#pragma GCC diagnostic ignored "-Winaccessible-base"
15+
#endif

‎source/scapix/detail/warning/pop.h‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
scapix/detail/warning/pop.h
3+
4+
Copyright (c) 2019-2023 Boris Rasin (boris@scapix.com)
5+
*/
6+
7+
#if defined(_MSC_VER)
8+
#pragma warning(pop)
9+
#endif
10+
11+
#if defined(__GNUG__) || defined(__clang__)
12+
#pragma GCC diagnostic pop
13+
#endif

‎source/scapix/java_api.h‎

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,14 @@
88
#define SCAPIX_JAVA_API_H
99

1010
#include <scapix/link/java/object_base.h>
11-
#include <scapix/link/java/ref.h>
1211
#include <scapix/link/java/convert.h>
1312

14-
namespace scapix {
15-
namespace java_api {
13+
namespace scapix::java_api {
1614

1715
using link::java::object_base;
1816
using link::java::ref;
1917
using link::java::generic;
2018

21-
} // namespace java_api
22-
} // namespace scapix
19+
} // namespace scapix::java_api
2320

2421
#endif // SCAPIX_JAVA_API_H

‎source/scapix/link/java/array.h‎

Lines changed: 2 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,10 @@
1818

1919
namespace scapix::link::java {
2020

21-
//template <typename T>
22-
//using array = object_type<signature_t<T[]>>;
23-
24-
// fix: already declared in ref.h
25-
26-
//template <typename T, typename = void>
27-
//class array;
28-
2921
template <typename T>
30-
class array_base : public object<signature_t<T[]>, handle_type_t<T[]>>
22+
class array_base : public object<signature_t<T[]>>
3123
{
32-
using base = object<signature_t<T[]>, handle_type_t<T[]>>;
24+
using base = object<signature_t<T[]>>;
3325

3426
public:
3527

@@ -458,14 +450,6 @@ class array<T, std::enable_if_t<is_primitive_v<T>>> : public array_base<T>
458450

459451
};
460452

461-
// to do: array<"Ljava/lang/Object;"> and array<'I'> is wrong
462-
463-
template <char... Chars>
464-
class object<meta::string<'[', Chars...>> : public array<meta::string<Chars...>>
465-
{
466-
using array<meta::string<Chars...>>::array;
467-
};
468-
469453
} // namespace scapix::link::java
470454

471455
#endif // SCAPIX_LINK_JAVA_ARRAY_H

‎source/scapix/link/java/byte_buffer.h‎

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,11 @@
77
#ifndef SCAPIX_LINK_JAVA_BYTE_BUFFER_H
88
#define SCAPIX_LINK_JAVA_BYTE_BUFFER_H
99

10-
#include <scapix/link/java/ref.h>
1110
#include <scapix/link/java/object.h>
1211

1312
namespace scapix::link::java {
1413

15-
template <typename ClassName = SCAPIX_META_STRING("java/nio/ByteBuffer")>
16-
class byte_buffer : public object<ClassName>
14+
class byte_buffer : public object<SCAPIX_META_STRING("java/nio/ByteBuffer")>
1715
{
1816
public:
1917

@@ -24,29 +22,20 @@ class byte_buffer : public object<ClassName>
2422

2523
void* direct_address() const
2624
{
27-
return detail::env()->GetDirectBufferAddress(this->handle());
25+
return detail::env()->GetDirectBufferAddress(handle());
2826
}
2927

3028
jlong direct_capacity() const
3129
{
32-
return detail::env()->GetDirectBufferCapacity(this->handle());
30+
return detail::env()->GetDirectBufferCapacity(handle());
3331
}
3432

3533
protected:
3634

37-
using base = object<ClassName>;
38-
byte_buffer(typename base::handle_type h) : base(h) {}
35+
byte_buffer(handle_type h) : object(h) {}
3936

4037
};
4138

42-
// to do: fix dependence on handle template parameter (add third bool template parameter?)
43-
44-
//template <>
45-
//class object<SCAPIX_META_STRING("java/nio/ByteBuffer")> : public byte_buffer<>
46-
//{
47-
// using byte_buffer<>::byte_buffer;
48-
//};
49-
5039
} // namespace scapix::link::java
5140

5241
#endif // SCAPIX_LINK_JAVA_BYTE_BUFFER_H

‎source/scapix/link/java/class.h‎

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,24 +4,23 @@
44
Copyright (c) 2019-2023 Boris Rasin (boris@scapix.com)
55
*/
66

7-
#include <scapix/link/java/object.h>
7+
// outside of include guard
8+
#include <scapix/link/java/object_impl.h>
89

910
#ifndef SCAPIX_LINK_JAVA_CLASS_H
1011
#define SCAPIX_LINK_JAVA_CLASS_H
1112

12-
#include <scapix/link/java/ref.h>
13+
#include <scapix/link/java/object.h>
1314
#include <scapix/link/java/signature.h>
1415
#include <scapix/link/java/detail/exception.h>
1516

1617
namespace scapix::link::java {
1718

18-
class class_ : public object<SCAPIX_META_STRING("java/lang/Class"), jclass>
19+
class class_ : public object<SCAPIX_META_STRING("java/lang/Class")>
1920
{
2021
public:
2122

22-
// Note: DefineClass() not supported on Android
23-
24-
static local_ref<class_> define_class(const char* name, ref<> loader, const jbyte* buf, jsize size)
23+
static local_ref<class_> define_class(const char* name, ref<SCAPIX_META_STRING("java/lang/ClassLoader")> loader, const jbyte* buf, jsize size)
2524
{
2625
jclass cls = detail::env()->DefineClass(name, loader.handle(), buf, size);
2726
detail::check_exception(cls);
@@ -114,16 +113,10 @@ class class_ : public object<SCAPIX_META_STRING("java/lang/Class"), jclass>
114113

115114
protected:
116115

117-
class_(handle_type h) : object_type(h) {}
116+
class_(handle_type h) : object(h) {}
118117

119118
};
120119

121-
template <>
122-
class object<SCAPIX_META_STRING("java/lang/Class")> : public class_
123-
{
124-
using class_::class_;
125-
};
126-
127120
} // namespace scapix::link::java
128121

129122
#endif // SCAPIX_LINK_JAVA_CLASS_H

‎source/scapix/link/java/class_loader.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
Copyright (c) 2019-2023 Boris Rasin (boris@scapix.com)
55
*/
66

7+
// outside of include guard
8+
#include <scapix/link/java/object_impl.h>
9+
710
#ifndef SCAPIX_LINK_JAVA_CLASS_LOADER_H
811
#define SCAPIX_LINK_JAVA_CLASS_LOADER_H
912

‎source/scapix/link/java/class_name.h‎

Lines changed: 0 additions & 29 deletions
This file was deleted.

‎source/scapix/link/java/convert.h‎

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ struct convert_string
139139
};
140140

141141
template <typename J, typename Cpp>
142-
struct convert<ref<J>, Cpp, std::enable_if_t<ref<string>::convertible_from<J> && std::is_convertible_v<Cpp, std::string> && !is_ref_v<Cpp>>> : convert_string
142+
struct convert<ref<J>, Cpp, std::enable_if_t<detail::is_convertible_element<J, string> && std::is_convertible_v<Cpp, std::string> && !is_ref_v<Cpp>>> : convert_string
143143
{
144144
};
145145

@@ -158,39 +158,39 @@ struct convert_primitive_object
158158
};
159159

160160
using boolean_class_name = SCAPIX_META_STRING("java/lang/Boolean");
161-
template <typename J> struct convert<ref<J>, bool, std::enable_if_t<ref<boolean_class_name>::convertible_from<J>>> :
161+
template <typename J> struct convert<ref<J>, bool, std::enable_if_t<detail::is_convertible_element<J, boolean_class_name>>> :
162162
convert_primitive_object<boolean_class_name, bool, jboolean, SCAPIX_META_STRING("booleanValue")> {};
163163

164164
using byte_class_name = SCAPIX_META_STRING("java/lang/Byte");
165165

166166
template <typename J, typename Cpp>
167-
struct convert<ref<J>, Cpp, std::enable_if_t<ref<byte_class_name>::convertible_from<J> && std::is_integral_v<Cpp> && sizeof(Cpp) == sizeof(std::int8_t)>> :
167+
struct convert<ref<J>, Cpp, std::enable_if_t<detail::is_convertible_element<J, byte_class_name> && std::is_integral_v<Cpp> && sizeof(Cpp) == sizeof(std::int8_t)>> :
168168
convert_primitive_object<byte_class_name, Cpp, jbyte, SCAPIX_META_STRING("byteValue")> {};
169169

170170
using short_class_name = SCAPIX_META_STRING("java/lang/Short");
171171

172172
template <typename J, typename Cpp>
173-
struct convert<ref<J>, Cpp, std::enable_if_t<ref<short_class_name>::convertible_from<J> && std::is_integral_v<Cpp> && sizeof(Cpp) == sizeof(std::int16_t)>> :
173+
struct convert<ref<J>, Cpp, std::enable_if_t<detail::is_convertible_element<J, short_class_name> && std::is_integral_v<Cpp> && sizeof(Cpp) == sizeof(std::int16_t)>> :
174174
convert_primitive_object<short_class_name, Cpp, jshort, SCAPIX_META_STRING("shortValue")> {};
175175

176176
using integer_class_name = SCAPIX_META_STRING("java/lang/Integer");
177177

178178
template <typename J, typename Cpp>
179-
struct convert<ref<J>, Cpp, std::enable_if_t<ref<integer_class_name>::convertible_from<J> && std::is_integral_v<Cpp> && sizeof(Cpp) == sizeof(std::int32_t)>> :
179+
struct convert<ref<J>, Cpp, std::enable_if_t<detail::is_convertible_element<J, integer_class_name> && std::is_integral_v<Cpp> && sizeof(Cpp) == sizeof(std::int32_t)>> :
180180
convert_primitive_object<integer_class_name, Cpp, jint, SCAPIX_META_STRING("intValue")> {};
181181

182182
using long_class_name = SCAPIX_META_STRING("java/lang/Long");
183183

184184
template <typename J, typename Cpp>
185-
struct convert<ref<J>, Cpp, std::enable_if_t<ref<long_class_name>::convertible_from<J> && std::is_integral_v<Cpp> && sizeof(Cpp) == sizeof(std::int64_t)>> :
185+
struct convert<ref<J>, Cpp, std::enable_if_t<detail::is_convertible_element<J, long_class_name> && std::is_integral_v<Cpp> && sizeof(Cpp) == sizeof(std::int64_t)>> :
186186
convert_primitive_object<long_class_name, Cpp, jlong, SCAPIX_META_STRING("longValue")> {};
187187

188188
using float_class_name = SCAPIX_META_STRING("java/lang/Float");
189-
template <typename J> struct convert<ref<J>, float, std::enable_if_t<ref<float_class_name>::convertible_from<J>>> :
189+
template <typename J> struct convert<ref<J>, float, std::enable_if_t<detail::is_convertible_element<J, float_class_name>>> :
190190
convert_primitive_object<float_class_name, float, jfloat, SCAPIX_META_STRING("floatValue")> {};
191191

192192
using double_class_name = SCAPIX_META_STRING("java/lang/Double");
193-
template <typename J> struct convert<ref<J>, double, std::enable_if_t<ref<double_class_name>::convertible_from<J>>> :
193+
template <typename J> struct convert<ref<J>, double, std::enable_if_t<detail::is_convertible_element<J, double_class_name>>> :
194194
convert_primitive_object<double_class_name, double, jdouble, SCAPIX_META_STRING("doubleValue")> {};
195195

196196
template <typename J, typename T, typename A>

0 commit comments

Comments
 (0)