Skip to content

Commit 3f12e9e

Browse files
WIP - hiding protected members
1 parent 0b7549d commit 3f12e9e

File tree

1 file changed

+28
-6
lines changed

1 file changed

+28
-6
lines changed

src/patterns.cpp

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,28 @@ struct VTableBase {
1616
void bind() {}
1717
};
1818

19+
1920
template<typename VTableType>
20-
struct ViewBase
21+
class ViewBase
2122
{
23+
protected:
2224
void * _obj;
2325
VTableType * _vtbl;
2426
};
2527

2628

29+
template<typename T>
30+
struct exposer : public T {};
31+
2732
struct writable
2833
{
34+
// forward delcarations
35+
struct view;
36+
template<typename T> view make_view(T & );
37+
38+
2939
template<typename BaseVTable = VTableBase>
30-
struct vtable : public BaseVTable
31-
{
40+
struct vtable : public BaseVTable {
3241
int (*write)(void * obj, const char *, int);
3342

3443
template<typename T>
@@ -55,18 +64,24 @@ struct writable
5564
template<typename BaseViewLayer = ViewBase<vtable<>>>
5665
struct ViewLayer : public BaseViewLayer
5766
{
67+
protected:
5868
using BaseViewLayer::_obj;
5969
using BaseViewLayer::_vtbl;
6070

71+
public:
6172
int write(const char * arg0, int arg1) { return _vtbl->write(_obj, arg0, arg1); }
6273
};
6374

64-
struct view : public ViewLayer<> {};
75+
struct view : public ViewLayer<> {
76+
template<typename T> friend view make_view<T &t>;
77+
};
78+
6579

6680
template<typename T>
6781
static view make_view(T & t)
6882
{
6983
view v;
84+
7085
v._obj = static_cast<void *>(&t);
7186
v._vtbl = vtable<>::make_vtable<T>();
7287
return v;
@@ -105,9 +120,10 @@ struct readable
105120
template<typename BaseViewLayer = ViewBase<vtable<>>>
106121
struct ViewLayer : public BaseViewLayer
107122
{
123+
protected:
108124
using BaseViewLayer::_obj;
109125
using BaseViewLayer::_vtbl;
110-
126+
public:
111127
int read(char * arg0, int arg1) { return _vtbl->read(_obj, arg0, arg1); }
112128
};
113129

@@ -152,11 +168,13 @@ struct readwritable
152168
template<typename BaseViewLayer = ViewBase<vtable<>>>
153169
struct ViewLayer : public writable::ViewLayer<readable::ViewLayer<BaseViewLayer>>
154170
{
171+
protected:
155172
using BaseViewLayer::_obj;
156173
using BaseViewLayer::_vtbl;
157174
};
158175

159-
struct view : public ViewLayer<> {};
176+
177+
struct view : public ViewLayer<> { };
160178

161179
template<typename T>
162180
static view make_view(T & t)
@@ -224,5 +242,9 @@ int main()
224242
char buf[5];
225243
wrv.read(buf, sizeof(buf));
226244
printf("done\n");
245+
246+
std::cout << "wrv._obj: " << &wrv._obj << std::endl;
247+
248+
227249
return 0;
228250
}

0 commit comments

Comments
 (0)