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
540ae61d
Commit
540ae61d
authored
Aug 28, 2016
by
Jason Rhinelander
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Replace tabs with spaces (to pass style check)
parent
ac427897
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
91 additions
and
91 deletions
+91
-91
tests/object.h
+81
-81
tests/test_stl_binders.cpp
+10
-10
No files found.
tests/object.h
View file @
540ae61d
...
...
@@ -13,32 +13,32 @@ public:
/// Copy constructor
Object
(
const
Object
&
)
:
m_refCount
(
0
)
{
print_copy_created
(
this
);
}
/// Return the current reference count
int
getRefCount
()
const
{
return
m_refCount
;
};
/// Increase the object's reference count by one
void
incRef
()
const
{
++
m_refCount
;
}
/** \brief Decrease the reference count of
* the object and possibly deallocate it.
*
* The object will automatically be deallocated once
* the reference count reaches zero.
*/
void
decRef
(
bool
dealloc
=
true
)
const
{
--
m_refCount
;
if
(
m_refCount
==
0
&&
dealloc
)
/// Return the current reference count
int
getRefCount
()
const
{
return
m_refCount
;
};
/// Increase the object's reference count by one
void
incRef
()
const
{
++
m_refCount
;
}
/** \brief Decrease the reference count of
* the object and possibly deallocate it.
*
* The object will automatically be deallocated once
* the reference count reaches zero.
*/
void
decRef
(
bool
dealloc
=
true
)
const
{
--
m_refCount
;
if
(
m_refCount
==
0
&&
dealloc
)
delete
this
;
else
if
(
m_refCount
<
0
)
throw
std
::
runtime_error
(
"Internal error: reference count < 0!"
);
throw
std
::
runtime_error
(
"Internal error: reference count < 0!"
);
}
virtual
std
::
string
toString
()
const
=
0
;
protected
:
/** \brief Virtual protected deconstructor.
* (Will only be called by \ref ref)
*/
virtual
~
Object
()
{
print_destroyed
(
this
);
}
/** \brief Virtual protected deconstructor.
* (Will only be called by \ref ref)
*/
virtual
~
Object
()
{
print_destroyed
(
this
);
}
private
:
mutable
std
::
atomic
<
int
>
m_refCount
{
0
};
};
...
...
@@ -61,18 +61,18 @@ class ref_tag {};
*/
template
<
typename
T
>
class
ref
{
public
:
/// Create a nullptr reference
/// Create a nullptr reference
ref
()
:
m_ptr
(
nullptr
)
{
print_default_created
(
this
);
track_default_created
((
ref_tag
*
)
this
);
}
/// Construct a reference from a pointer
ref
(
T
*
ptr
)
:
m_ptr
(
ptr
)
{
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
incRef
();
ref
(
T
*
ptr
)
:
m_ptr
(
ptr
)
{
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
incRef
();
print_created
(
this
,
"from pointer"
,
m_ptr
);
track_created
((
ref_tag
*
)
this
,
"from pointer"
);
}
}
/// Copy constructor
/// Copy constructor
ref
(
const
ref
&
r
)
:
m_ptr
(
r
.
m_ptr
)
{
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
incRef
();
...
...
@@ -96,80 +96,80 @@ public:
}
/// Move another reference into the current one
ref
&
operator
=
(
ref
&&
r
)
{
ref
&
operator
=
(
ref
&&
r
)
{
print_move_assigned
(
this
,
"pointer"
,
r
.
m_ptr
);
track_move_assigned
((
ref_tag
*
)
this
);
if
(
*
this
==
r
)
return
*
this
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
decRef
();
m_ptr
=
r
.
m_ptr
;
r
.
m_ptr
=
nullptr
;
return
*
this
;
}
/// Overwrite this reference with another reference
ref
&
operator
=
(
const
ref
&
r
)
{
if
(
*
this
==
r
)
return
*
this
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
decRef
();
m_ptr
=
r
.
m_ptr
;
r
.
m_ptr
=
nullptr
;
return
*
this
;
}
/// Overwrite this reference with another reference
ref
&
operator
=
(
const
ref
&
r
)
{
print_copy_assigned
(
this
,
"pointer"
,
r
.
m_ptr
);
track_copy_assigned
((
ref_tag
*
)
this
);
if
(
m_ptr
==
r
.
m_ptr
)
return
*
this
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
decRef
();
m_ptr
=
r
.
m_ptr
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
incRef
();
return
*
this
;
}
/// Overwrite this reference with a pointer to another object
ref
&
operator
=
(
T
*
ptr
)
{
if
(
m_ptr
==
r
.
m_ptr
)
return
*
this
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
decRef
();
m_ptr
=
r
.
m_ptr
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
incRef
();
return
*
this
;
}
/// Overwrite this reference with a pointer to another object
ref
&
operator
=
(
T
*
ptr
)
{
print_values
(
this
,
"assigned pointer"
);
track_values
((
ref_tag
*
)
this
,
"assigned pointer"
);
if
(
m_ptr
==
ptr
)
return
*
this
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
decRef
();
m_ptr
=
ptr
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
incRef
();
return
*
this
;
}
if
(
m_ptr
==
ptr
)
return
*
this
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
decRef
();
m_ptr
=
ptr
;
if
(
m_ptr
)
((
Object
*
)
m_ptr
)
->
incRef
();
return
*
this
;
}
/// Compare this reference with another reference
bool
operator
==
(
const
ref
&
r
)
const
{
return
m_ptr
==
r
.
m_ptr
;
}
/// Compare this reference with another reference
bool
operator
==
(
const
ref
&
r
)
const
{
return
m_ptr
==
r
.
m_ptr
;
}
/// Compare this reference with another reference
bool
operator
!=
(
const
ref
&
r
)
const
{
return
m_ptr
!=
r
.
m_ptr
;
}
/// Compare this reference with another reference
bool
operator
!=
(
const
ref
&
r
)
const
{
return
m_ptr
!=
r
.
m_ptr
;
}
/// Compare this reference with a pointer
bool
operator
==
(
const
T
*
ptr
)
const
{
return
m_ptr
==
ptr
;
}
/// Compare this reference with a pointer
bool
operator
==
(
const
T
*
ptr
)
const
{
return
m_ptr
==
ptr
;
}
/// Compare this reference with a pointer
bool
operator
!=
(
const
T
*
ptr
)
const
{
return
m_ptr
!=
ptr
;
}
/// Compare this reference with a pointer
bool
operator
!=
(
const
T
*
ptr
)
const
{
return
m_ptr
!=
ptr
;
}
/// Access the object referenced by this reference
T
*
operator
->
()
{
return
m_ptr
;
}
/// Access the object referenced by this reference
T
*
operator
->
()
{
return
m_ptr
;
}
/// Access the object referenced by this reference
const
T
*
operator
->
()
const
{
return
m_ptr
;
}
/// Access the object referenced by this reference
const
T
*
operator
->
()
const
{
return
m_ptr
;
}
/// Return a C++ reference to the referenced object
T
&
operator
*
()
{
return
*
m_ptr
;
}
/// Return a C++ reference to the referenced object
T
&
operator
*
()
{
return
*
m_ptr
;
}
/// Return a const C++ reference to the referenced object
const
T
&
operator
*
()
const
{
return
*
m_ptr
;
}
/// Return a const C++ reference to the referenced object
const
T
&
operator
*
()
const
{
return
*
m_ptr
;
}
/// Return a pointer to the referenced object
operator
T
*
()
{
return
m_ptr
;
}
/// Return a pointer to the referenced object
operator
T
*
()
{
return
m_ptr
;
}
/// Return a const pointer to the referenced object
T
*
get
()
{
return
m_ptr
;
}
/// Return a const pointer to the referenced object
T
*
get
()
{
return
m_ptr
;
}
/// Return a pointer to the referenced object
const
T
*
get
()
const
{
return
m_ptr
;
}
/// Return a pointer to the referenced object
const
T
*
get
()
const
{
return
m_ptr
;
}
private
:
T
*
m_ptr
;
T
*
m_ptr
;
};
#endif
/* __OBJECT_H */
tests/test_stl_binders.cpp
View file @
540ae61d
...
...
@@ -13,25 +13,25 @@
class
El
{
public
:
El
()
=
delete
;
El
(
int
v
)
:
a
(
v
)
{
}
El
()
=
delete
;
El
(
int
v
)
:
a
(
v
)
{
}
int
a
;
int
a
;
};
std
::
ostream
&
operator
<<
(
std
::
ostream
&
s
,
El
const
&
v
)
{
s
<<
"El{"
<<
v
.
a
<<
'}'
;
return
s
;
s
<<
"El{"
<<
v
.
a
<<
'}'
;
return
s
;
}
void
init_ex_stl_binder_vector
(
py
::
module
&
m
)
{
py
::
class_
<
El
>
(
m
,
"El"
)
.
def
(
py
::
init
<
int
>
());
py
::
class_
<
El
>
(
m
,
"El"
)
.
def
(
py
::
init
<
int
>
());
py
::
bind_vector
<
unsigned
int
>
(
m
,
"VectorInt"
);
py
::
bind_vector
<
bool
>
(
m
,
"VectorBool"
);
py
::
bind_vector
<
unsigned
int
>
(
m
,
"VectorInt"
);
py
::
bind_vector
<
bool
>
(
m
,
"VectorBool"
);
py
::
bind_vector
<
El
>
(
m
,
"VectorEl"
);
py
::
bind_vector
<
El
>
(
m
,
"VectorEl"
);
py
::
bind_vector
<
std
::
vector
<
El
>>
(
m
,
"VectorVectorEl"
);
}
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