rucy 0.1.12 → 0.1.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.doc/ext/rucy/class.cpp +12 -75
- data/.doc/ext/rucy/tester.cpp +2 -2
- data/LICENSE +21 -0
- data/README.md +2 -2
- data/Rakefile +10 -15
- data/VERSION +1 -1
- data/ext/rucy/class.cpp +19 -86
- data/ext/rucy/class.h +0 -10
- data/ext/rucy/extconf.rb +2 -3
- data/ext/rucy/tester.cpp +2 -2
- data/include/rucy.h +4 -1
- data/include/rucy/debug.h +22 -0
- data/include/rucy/exception.h +29 -9
- data/include/rucy/extension.h.erb +97 -172
- data/include/rucy/module.h.erb +1 -1
- data/include/rucy/ruby.h +0 -1
- data/include/rucy/value.h.erb +30 -15
- data/lib/rucy/module.rb +4 -19
- data/lib/rucy/rake.rb +62 -0
- data/rucy.gemspec +4 -6
- data/src/module.cpp.erb +1 -1
- data/src/value.cpp.erb +53 -43
- data/test/test_class.rb +2 -34
- metadata +24 -50
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 590d30c635bbc6cdf9d3f4f4c2022a0d024c62c0d2f3e08a83f075ac2ef50681
|
4
|
+
data.tar.gz: 20f747540814744c0444d7606c488167f9cc1d1ae5f751527e21cf57f7880bef
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee3769c74d21c01131a036582c16ce6083c5eacc87bd528044f00c459a5480cae28dc129ec306dd171385a22588b07ffe62de6ccea946e0cb5a4f643ede20144
|
7
|
+
data.tar.gz: 9af4e962f4b62b49ed5c7d213fb28357f7ebe00279b6b7d981e2dd5991d17e289547ac28a69e247f96277973aeee13b94ab7fef462c65276ad4f59b049e3711f
|
data/.doc/ext/rucy/class.cpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "class.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include <vector>
|
4
5
|
#include "rucy.h"
|
5
6
|
|
6
7
|
|
@@ -30,46 +31,27 @@ template <typename T>
|
|
30
31
|
class RubyBase : public ClassWrapper<T>
|
31
32
|
{
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
RUCY_OVERRIDE_BEGIN(ClassWrapper<T>)
|
34
|
+
typedef ClassWrapper<T> Super;
|
36
35
|
|
37
|
-
|
38
|
-
|
39
|
-
RUCY_OVERRIDE_END
|
36
|
+
public:
|
40
37
|
|
41
38
|
virtual const char* name_overridable () const
|
42
39
|
{
|
43
40
|
RUCY_SYM(name_overridable);
|
44
|
-
if (
|
41
|
+
if (this->is_overridable())
|
45
42
|
return this->value.call(name_overridable).c_str();
|
46
43
|
else
|
47
44
|
return Super::name_overridable();
|
48
45
|
}
|
49
46
|
|
50
|
-
virtual const char* name_overridable_faster () const
|
51
|
-
{
|
52
|
-
RUCY_SYM(name_overridable_faster);
|
53
|
-
if (RUCY_IS_OVERRIDDEN(name_overridable_faster))
|
54
|
-
return this->value.call(name_overridable_faster).c_str();
|
55
|
-
else
|
56
|
-
return Super::name_overridable_faster();
|
57
|
-
}
|
58
|
-
|
59
|
-
bool is_name_overridable_faster_overridden () const
|
60
|
-
{
|
61
|
-
RUCY_SYM(name_overridable_faster);
|
62
|
-
return RUCY_IS_OVERRIDDEN(name_overridable_faster);
|
63
|
-
}
|
64
|
-
|
65
47
|
};// RubyBase
|
66
48
|
|
67
49
|
|
68
|
-
#define THIS(type)
|
50
|
+
#define THIS(type) to<type*>(self)
|
69
51
|
|
70
|
-
#define CHECK(type)
|
52
|
+
#define CHECK(type) RUCY_CHECK_OBJ(type, self)
|
71
53
|
|
72
|
-
#define CALL(
|
54
|
+
#define CALL(obj, fun) RUCY_CALL_SUPER(obj, fun)
|
73
55
|
|
74
56
|
|
75
57
|
/*
|
@@ -99,7 +81,7 @@ static
|
|
99
81
|
VALUE base_name_overridable(VALUE self)
|
100
82
|
{
|
101
83
|
CHECK(Base);
|
102
|
-
return value(CALL(
|
84
|
+
return value(CALL(THIS(Base), name_overridable()));
|
103
85
|
}
|
104
86
|
|
105
87
|
static
|
@@ -109,33 +91,6 @@ VALUE call_name_overridable(VALUE self)
|
|
109
91
|
return value(THIS(Base)->name_overridable());
|
110
92
|
}
|
111
93
|
|
112
|
-
static
|
113
|
-
VALUE base_name_overridable_faster(VALUE self)
|
114
|
-
{
|
115
|
-
CHECK(Base);
|
116
|
-
return value(CALL(Base, THIS(Base), name_overridable_faster()));
|
117
|
-
}
|
118
|
-
|
119
|
-
static
|
120
|
-
VALUE call_name_overridable_faster(VALUE self)
|
121
|
-
{
|
122
|
-
CHECK(Base);
|
123
|
-
return value(THIS(Base)->name_overridable_faster());
|
124
|
-
}
|
125
|
-
|
126
|
-
template <typename T>
|
127
|
-
static
|
128
|
-
VALUE is_name_overridable_faster_overridden(VALUE self)
|
129
|
-
{
|
130
|
-
RUCY_CHECK_OBJ(T, self);
|
131
|
-
RubyBase<T>* obj = dynamic_cast<RubyBase<T>*>(THIS(T));
|
132
|
-
if (!obj) invalid_object_error(__FILE__, __LINE__, "dynamic_cast() failed.");
|
133
|
-
return value(obj->is_name_overridable_faster_overridden());
|
134
|
-
}
|
135
|
-
|
136
|
-
static RUCY_DEF_clear_override_flags(Base_clear_override_flags, Base);
|
137
|
-
static RUCY_DEF_clear_override_flags(Sub_clear_override_flags, Sub);
|
138
|
-
|
139
94
|
static
|
140
95
|
VALUE base_new_raw(VALUE self)
|
141
96
|
{
|
@@ -156,14 +111,7 @@ static
|
|
156
111
|
VALUE sub_name_overridable(VALUE self)
|
157
112
|
{
|
158
113
|
CHECK(Sub);
|
159
|
-
return value(CALL(
|
160
|
-
}
|
161
|
-
|
162
|
-
static
|
163
|
-
VALUE sub_name_overridable_faster(VALUE self)
|
164
|
-
{
|
165
|
-
CHECK(Sub);
|
166
|
-
return value(CALL(Sub, THIS(Sub), name_overridable_faster()));
|
114
|
+
return value(CALL(THIS(Sub), name_overridable()));
|
167
115
|
}
|
168
116
|
|
169
117
|
static
|
@@ -189,7 +137,7 @@ VALUE simpleobj_initialize(VALUE self, VALUE name)
|
|
189
137
|
THIS(SimpleObj)->init(name.c_str());
|
190
138
|
}
|
191
139
|
|
192
|
-
static std::vector<Xot::Ref<SimpleObj
|
140
|
+
static std::vector<Xot::Ref<SimpleObj>> simpleobj_refs;
|
193
141
|
|
194
142
|
static
|
195
143
|
VALUE simpleobj_set_refs(VALUE self, VALUE objs)
|
@@ -217,29 +165,18 @@ Init_class ()
|
|
217
165
|
rb_define_alloc_func(cBase, base_alloc);
|
218
166
|
rb_define_method(cBase, "name", RUBY_METHOD_FUNC(name), 0);
|
219
167
|
rb_define_method(cBase, "name_overridable", RUBY_METHOD_FUNC(base_name_overridable), 0);
|
220
|
-
rb_define_method(cBase, "name_overridable_faster", RUBY_METHOD_FUNC(base_name_overridable_faster), 0);
|
221
168
|
rb_define_method(cBase, "call_name", RUBY_METHOD_FUNC(call_name), 0);
|
222
169
|
rb_define_method(cBase, "call_name_overridable", RUBY_METHOD_FUNC(call_name_overridable), 0);
|
223
|
-
rb_define_method(cBase, "call_name_overridable_faster", RUBY_METHOD_FUNC(call_name_overridable_faster), 0);
|
224
|
-
cBase.define_method(
|
225
|
-
"is_name_overridable_faster_overridden",
|
226
|
-
is_name_overridable_faster_overridden<Base>);
|
227
170
|
rb_define_singleton_method(cBase, "new_raw", RUBY_METHOD_FUNC(base_new_raw), 0);
|
228
|
-
|
229
171
|
|
230
172
|
cSub = rb_define_class_under(mTester, "Sub", cBase);
|
231
173
|
rb_define_alloc_func(cSub, sub_alloc);
|
232
174
|
rb_define_method(cSub, "name_overridable", RUBY_METHOD_FUNC(sub_name_overridable), 0);
|
233
|
-
rb_define_method(cSub, "name_overridable_faster", RUBY_METHOD_FUNC(sub_name_overridable_faster), 0);
|
234
|
-
cSub.define_method(
|
235
|
-
"is_name_overridable_faster_overridden",
|
236
|
-
is_name_overridable_faster_overridden<Sub>);
|
237
175
|
rb_define_singleton_method(cSub, "new_raw", RUBY_METHOD_FUNC(sub_new_raw), 0);
|
238
|
-
|
239
176
|
|
240
177
|
cSimpleObj = rb_define_class_under(mTester, "SimpleObj", rb_cObject);
|
241
178
|
rb_define_alloc_func(cSimpleObj, simpleobj_alloc);
|
242
179
|
rb_define_private_method(cSimpleObj, "initialize", RUBY_METHOD_FUNC(simpleobj_initialize), 1);
|
243
|
-
|
244
|
-
|
180
|
+
rb_define_module_function(cSimpleObj, "set_refs", RUBY_METHOD_FUNC(simpleobj_set_refs), 1);
|
181
|
+
rb_define_module_function(cSimpleObj, "clear_refs", RUBY_METHOD_FUNC(simpleobj_clear_refs), 0);
|
245
182
|
}
|
data/.doc/ext/rucy/tester.cpp
CHANGED
@@ -54,8 +54,8 @@ Init_tester ()
|
|
54
54
|
Module mRucy = rb_define_module("Rucy");
|
55
55
|
Module mTester = rb_define_module_under(mRucy, "Tester");
|
56
56
|
|
57
|
-
|
58
|
-
|
57
|
+
rb_define_module_function(mTester, "all_logs", RUBY_METHOD_FUNC(all_logs), 0);
|
58
|
+
rb_define_module_function(mTester, "clear_logs", RUBY_METHOD_FUNC(clear_logs), 0);
|
59
59
|
|
60
60
|
Init_value();
|
61
61
|
Init_exception();
|
data/LICENSE
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
MIT License
|
2
|
+
|
3
|
+
Copyright (c) 2019 xord.org
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
13
|
+
copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
21
|
+
SOFTWARE.
|
data/README.md
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
|
2
2
|
# Rucy - A Ruby C++ Extension Helper Library.
|
3
3
|
|
4
|
-
by
|
4
|
+
by xordog@gmail.com
|
5
5
|
|
6
6
|
|
7
7
|
## What is this library?
|
@@ -28,4 +28,4 @@ see ext/rucy/tester.cpp.
|
|
28
28
|
## Contact information.
|
29
29
|
|
30
30
|
Web: http://blog.xord.org/
|
31
|
-
Mail:
|
31
|
+
Mail: xordog@gmail.com
|
data/Rakefile
CHANGED
@@ -2,28 +2,23 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
%w[../xot .]
|
5
|
-
.map {|s| File.expand_path "
|
5
|
+
.map {|s| File.expand_path "#{s}/lib", __dir__}
|
6
6
|
.each {|s| $:.unshift s if !$:.include?(s) && File.directory?(s)}
|
7
7
|
|
8
|
-
require '
|
8
|
+
require 'rucy/rake'
|
9
|
+
|
9
10
|
require 'xot/module'
|
10
11
|
require 'rucy/module'
|
11
12
|
|
12
|
-
include Xot::Rake
|
13
|
-
|
14
13
|
|
15
|
-
MODULES = [Xot, Rucy]
|
16
|
-
MODULE = MODULES.last
|
17
|
-
DLNAME = 'tester'
|
18
|
-
INCDIRS = ruby_incdirs
|
19
|
-
RUCY2RDOC = 'bin/rucy2rdoc'
|
14
|
+
MODULES = [Xot, Rucy]
|
20
15
|
NPARAM_MAX = 8
|
21
16
|
NTIMES = (0..NPARAM_MAX)
|
22
17
|
|
18
|
+
build_native_library
|
19
|
+
build_ruby_extension dlname: :tester
|
20
|
+
test_ruby_extension
|
21
|
+
generate_documents
|
22
|
+
build_ruby_gem
|
23
23
|
|
24
|
-
task :default => :
|
25
|
-
|
26
|
-
task :build => :lib
|
27
|
-
|
28
|
-
|
29
|
-
MODULES.each {|m| m.load_tasks :lib, :ext, :test, :doc, :gem}
|
24
|
+
task :default => :test
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.18
|
data/ext/rucy/class.cpp
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
#include "class.h"
|
2
2
|
|
3
3
|
|
4
|
+
#include <vector>
|
4
5
|
#include "rucy.h"
|
5
6
|
|
6
7
|
|
@@ -30,46 +31,27 @@ template <typename T>
|
|
30
31
|
class RubyBase : public ClassWrapper<T>
|
31
32
|
{
|
32
33
|
|
33
|
-
|
34
|
-
|
35
|
-
RUCY_OVERRIDE_BEGIN(ClassWrapper<T>)
|
36
|
-
|
37
|
-
RUCY_OVERRIDE_ID(name_overridable_faster)
|
34
|
+
typedef ClassWrapper<T> Super;
|
38
35
|
|
39
|
-
|
36
|
+
public:
|
40
37
|
|
41
38
|
virtual const char* name_overridable () const
|
42
39
|
{
|
43
40
|
RUCY_SYM(name_overridable);
|
44
|
-
if (
|
41
|
+
if (this->is_overridable())
|
45
42
|
return this->value.call(name_overridable).c_str();
|
46
43
|
else
|
47
44
|
return Super::name_overridable();
|
48
45
|
}
|
49
46
|
|
50
|
-
virtual const char* name_overridable_faster () const
|
51
|
-
{
|
52
|
-
RUCY_SYM(name_overridable_faster);
|
53
|
-
if (RUCY_IS_OVERRIDDEN(name_overridable_faster))
|
54
|
-
return this->value.call(name_overridable_faster).c_str();
|
55
|
-
else
|
56
|
-
return Super::name_overridable_faster();
|
57
|
-
}
|
58
|
-
|
59
|
-
bool is_name_overridable_faster_overridden () const
|
60
|
-
{
|
61
|
-
RUCY_SYM(name_overridable_faster);
|
62
|
-
return RUCY_IS_OVERRIDDEN(name_overridable_faster);
|
63
|
-
}
|
64
|
-
|
65
47
|
};// RubyBase
|
66
48
|
|
67
49
|
|
68
|
-
#define THIS(type)
|
50
|
+
#define THIS(type) to<type*>(self)
|
69
51
|
|
70
|
-
#define CHECK(type)
|
52
|
+
#define CHECK(type) RUCY_CHECK_OBJ(type, self)
|
71
53
|
|
72
|
-
#define CALL(
|
54
|
+
#define CALL(obj, fun) RUCY_CALL_SUPER(obj, fun)
|
73
55
|
|
74
56
|
|
75
57
|
/*
|
@@ -102,7 +84,7 @@ static
|
|
102
84
|
RUCY_DEF0(base_name_overridable)
|
103
85
|
{
|
104
86
|
CHECK(Base);
|
105
|
-
return value(CALL(
|
87
|
+
return value(CALL(THIS(Base), name_overridable()));
|
106
88
|
}
|
107
89
|
RUCY_END
|
108
90
|
|
@@ -114,36 +96,6 @@ RUCY_DEF0(call_name_overridable)
|
|
114
96
|
}
|
115
97
|
RUCY_END
|
116
98
|
|
117
|
-
static
|
118
|
-
RUCY_DEF0(base_name_overridable_faster)
|
119
|
-
{
|
120
|
-
CHECK(Base);
|
121
|
-
return value(CALL(Base, THIS(Base), name_overridable_faster()));
|
122
|
-
}
|
123
|
-
RUCY_END
|
124
|
-
|
125
|
-
static
|
126
|
-
RUCY_DEF0(call_name_overridable_faster)
|
127
|
-
{
|
128
|
-
CHECK(Base);
|
129
|
-
return value(THIS(Base)->name_overridable_faster());
|
130
|
-
}
|
131
|
-
RUCY_END
|
132
|
-
|
133
|
-
template <typename T>
|
134
|
-
static
|
135
|
-
RUCY_DEF0(is_name_overridable_faster_overridden)
|
136
|
-
{
|
137
|
-
RUCY_CHECK_OBJ(T, self);
|
138
|
-
RubyBase<T>* obj = dynamic_cast<RubyBase<T>*>(THIS(T));
|
139
|
-
if (!obj) invalid_object_error(__FILE__, __LINE__, "dynamic_cast() failed.");
|
140
|
-
return value(obj->is_name_overridable_faster_overridden());
|
141
|
-
}
|
142
|
-
RUCY_END
|
143
|
-
|
144
|
-
static RUCY_DEF_clear_override_flags(Base_clear_override_flags, Base);
|
145
|
-
static RUCY_DEF_clear_override_flags(Sub_clear_override_flags, Sub);
|
146
|
-
|
147
99
|
static
|
148
100
|
RUCY_DEF0(base_new_raw)
|
149
101
|
{
|
@@ -166,15 +118,7 @@ static
|
|
166
118
|
RUCY_DEF0(sub_name_overridable)
|
167
119
|
{
|
168
120
|
CHECK(Sub);
|
169
|
-
return value(CALL(
|
170
|
-
}
|
171
|
-
RUCY_END
|
172
|
-
|
173
|
-
static
|
174
|
-
RUCY_DEF0(sub_name_overridable_faster)
|
175
|
-
{
|
176
|
-
CHECK(Sub);
|
177
|
-
return value(CALL(Sub, THIS(Sub), name_overridable_faster()));
|
121
|
+
return value(CALL(THIS(Sub), name_overridable()));
|
178
122
|
}
|
179
123
|
RUCY_END
|
180
124
|
|
@@ -204,7 +148,7 @@ RUCY_DEF1(simpleobj_initialize, name)
|
|
204
148
|
}
|
205
149
|
RUCY_END
|
206
150
|
|
207
|
-
static std::vector<Xot::Ref<SimpleObj
|
151
|
+
static std::vector<Xot::Ref<SimpleObj>> simpleobj_refs;
|
208
152
|
|
209
153
|
static
|
210
154
|
RUCY_DEF1(simpleobj_set_refs, objs)
|
@@ -232,31 +176,20 @@ Init_class ()
|
|
232
176
|
|
233
177
|
cBase = mTester.define_class("Base");
|
234
178
|
cBase.define_alloc_func(base_alloc);
|
235
|
-
cBase.define_method( "name",
|
236
|
-
cBase.define_method( "name_overridable",
|
237
|
-
cBase.define_method(
|
238
|
-
cBase.define_method("
|
239
|
-
cBase.
|
240
|
-
cBase.define_method("call_name_overridable_faster", call_name_overridable_faster);
|
241
|
-
cBase.define_method(
|
242
|
-
"is_name_overridable_faster_overridden",
|
243
|
-
is_name_overridable_faster_overridden<Base>);
|
244
|
-
cBase.define_singleton_method("new_raw", base_new_raw);
|
245
|
-
cBase.define_clear_override_flags(Base_clear_override_flags);
|
179
|
+
cBase.define_method( "name", name);
|
180
|
+
cBase.define_method( "name_overridable", base_name_overridable);
|
181
|
+
cBase.define_method("call_name", call_name);
|
182
|
+
cBase.define_method("call_name_overridable", call_name_overridable);
|
183
|
+
cBase.define_singleton_method("new_raw", base_new_raw);
|
246
184
|
|
247
185
|
cSub = mTester.define_class("Sub", cBase);
|
248
186
|
cSub.define_alloc_func(sub_alloc);
|
249
|
-
cSub.define_method("name_overridable",
|
250
|
-
cSub.
|
251
|
-
cSub.define_method(
|
252
|
-
"is_name_overridable_faster_overridden",
|
253
|
-
is_name_overridable_faster_overridden<Sub>);
|
254
|
-
cSub.define_singleton_method("new_raw", sub_new_raw);
|
255
|
-
cSub.define_clear_override_flags(Sub_clear_override_flags);
|
187
|
+
cSub.define_method("name_overridable", sub_name_overridable);
|
188
|
+
cSub.define_singleton_method("new_raw", sub_new_raw);
|
256
189
|
|
257
190
|
cSimpleObj = mTester.define_class("SimpleObj");
|
258
191
|
cSimpleObj.define_alloc_func(simpleobj_alloc);
|
259
192
|
cSimpleObj.define_private_method("initialize", simpleobj_initialize);
|
260
|
-
cSimpleObj.
|
261
|
-
cSimpleObj.
|
193
|
+
cSimpleObj.define_module_function("set_refs", simpleobj_set_refs);
|
194
|
+
cSimpleObj.define_module_function("clear_refs", simpleobj_clear_refs);
|
262
195
|
}
|
data/ext/rucy/class.h
CHANGED
@@ -35,11 +35,6 @@ class Base : public Xot::RefCountable<>
|
|
35
35
|
return "Base::name_overridable";
|
36
36
|
}
|
37
37
|
|
38
|
-
virtual const char* name_overridable_faster () const
|
39
|
-
{
|
40
|
-
return "Base::name_overridable_faster";
|
41
|
-
}
|
42
|
-
|
43
38
|
};// Base
|
44
39
|
|
45
40
|
|
@@ -68,11 +63,6 @@ class Sub : public Base
|
|
68
63
|
return "Sub::name_overridable";
|
69
64
|
}
|
70
65
|
|
71
|
-
virtual const char* name_overridable_faster () const
|
72
|
-
{
|
73
|
-
return "Sub::name_overridable_faster";
|
74
|
-
}
|
75
|
-
|
76
66
|
};// Sub
|
77
67
|
|
78
68
|
|