Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
P
pybind11
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
open
pybind11
Commits
57132c49
Commit
57132c49
authored
Jan 05, 2021
by
Ralf W. Grosse-Kunstleve
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Adding vptr_deleter.
parent
3f7e5221
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
18 additions
and
16 deletions
+18
-16
include/pybind11/smart_holder_poc.h
+18
-16
No files found.
include/pybind11/smart_holder_poc.h
View file @
57132c49
...
@@ -9,10 +9,19 @@ struct smart_holder {
...
@@ -9,10 +9,19 @@ struct smart_holder {
std
::
shared_ptr
<
void
>
vptr
;
std
::
shared_ptr
<
void
>
vptr
;
const
std
::
type_info
*
rtti_held
;
const
std
::
type_info
*
rtti_held
;
const
std
::
type_info
*
rtti_uqp_del
;
const
std
::
type_info
*
rtti_uqp_del
;
bool
have_external_shp
;
bool
vptr_deleter_flag
;
template
<
typename
T
>
struct
vptr_deleter
{
bool
*
flag_ptr
;
explicit
vptr_deleter
(
bool
*
flag_ptr_
)
:
flag_ptr
{
flag_ptr_
}
{}
void
operator
()(
T
*
raw_ptr
)
{
if
(
*
flag_ptr
)
delete
raw_ptr
;
}
};
smart_holder
()
smart_holder
()
:
rtti_held
{
nullptr
},
rtti_uqp_del
{
nullptr
},
have_external_shp
(
false
)
{}
:
rtti_held
{
nullptr
},
rtti_uqp_del
{
nullptr
},
vptr_deleter_flag
{
false
}
{}
template
<
typename
T
>
template
<
typename
T
>
void
ensure_compatible_rtti
(
const
char
*
context
)
{
void
ensure_compatible_rtti
(
const
char
*
context
)
{
...
@@ -30,23 +39,17 @@ struct smart_holder {
...
@@ -30,23 +39,17 @@ struct smart_holder {
}
}
}
}
void
ensure_
unique_ptr_default_deleter
(
const
char
*
context
)
{
void
ensure_
vptr_deleter_flag_true
(
const
char
*
context
)
{
if
(
rtti_uqp_del
!=
nullptr
)
{
if
(
rtti_uqp_del
!=
nullptr
)
{
throw
std
::
runtime_error
(
throw
std
::
runtime_error
(
std
::
string
(
"Cannot disown this shared_ptr ("
)
+
std
::
string
(
"Cannot disown unique_ptr deleter ("
)
+
context
+
")."
);
context
+
")."
);
}
}
void
ensure_internal_shared_ptr
(
const
char
*
context
)
{
if
(
have_external_shp
)
{
throw
std
::
runtime_error
(
std
::
string
(
"Cannot disown external shared_ptr ("
)
+
context
+
")."
);
}
}
}
}
template
<
typename
T
>
template
<
typename
T
>
void
from_raw_ptr_owned
(
T
*
raw_ptr
)
{
void
from_raw_ptr_owned
(
T
*
raw_ptr
)
{
vptr
.
reset
(
raw_ptr
);
vptr_deleter_flag
=
true
;
vptr
.
reset
(
raw_ptr
,
vptr_deleter
<
T
>
(
&
vptr_deleter_flag
));
rtti_held
=
&
typeid
(
T
);
rtti_held
=
&
typeid
(
T
);
}
}
...
@@ -55,12 +58,11 @@ struct smart_holder {
...
@@ -55,12 +58,11 @@ struct smart_holder {
static
const
char
*
context
=
"as_raw_ptr_owned"
;
static
const
char
*
context
=
"as_raw_ptr_owned"
;
ensure_compatible_rtti
<
T
>
(
context
);
ensure_compatible_rtti
<
T
>
(
context
);
ensure_use_count_1
(
context
);
ensure_use_count_1
(
context
);
ensure_unique_ptr_default_deleter
(
context
);
ensure_vptr_deleter_flag_true
(
context
);
ensure_internal_shared_ptr
(
context
);
std
::
shared_ptr
<
T
>
tptr
=
std
::
static_pointer_cast
<
T
>
(
vptr
);
std
::
shared_ptr
<
T
>
tptr
=
std
::
static_pointer_cast
<
T
>
(
vptr
);
vptr
.
reset
();
vptr
.
reset
();
T
*
result
=
tptr
.
get
();
T
*
result
=
tptr
.
get
();
// TODO tptr.release()
;
vptr_deleter_flag
=
false
;
return
result
;
return
result
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment