NVBIO
Main Page
Modules
Classes
Examples
File List
File Members
•
All
Classes
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Friends
Macros
Groups
Pages
contrib
moderngpu
include
util
util.h
Go to the documentation of this file.
1
/******************************************************************************
2
* Copyright (c) 2013, NVIDIA CORPORATION. All rights reserved.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are met:
6
* * Redistributions of source code must retain the above copyright
7
* notice, this list of conditions and the following disclaimer.
8
* * Redistributions in binary form must reproduce the above copyright
9
* notice, this list of conditions and the following disclaimer in the
10
* documentation and/or other materials provided with the distribution.
11
* * Neither the name of the NVIDIA CORPORATION nor the
12
* names of its contributors may be used to endorse or promote products
13
* derived from this software without specific prior written permission.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
* ARE DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY
19
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25
*
26
******************************************************************************/
27
28
/******************************************************************************
29
*
30
* Code and text by Sean Baxter, NVIDIA Research
31
* See http://nvlabs.github.io/moderngpu for repository and documentation.
32
*
33
******************************************************************************/
34
35
#pragma once
36
37
#include "
static.h
"
38
39
namespace
mgpu {
40
41
extern
int
Rand
(
int
min
,
int
max
);
42
extern
int64
Rand
(
int64
min
,
int64
max
);
43
extern
uint
Rand
(
uint
min
,
uint
max
);
44
extern
uint64
Rand
(
uint64
min
,
uint64
max
);
45
extern
float
Rand
(
float
min
,
float
max
);
46
extern
double
Rand
(
double
min
,
double
max
);
47
48
50
// intrusive_ptr
51
52
// boost::noncopyable, moved here so we don't have dependency on boost
53
class
noncopyable
{
54
protected
:
55
noncopyable
() {}
56
~noncopyable
() {}
57
private
:
58
noncopyable
(
const
noncopyable
&) { }
59
const
noncopyable
& operator=(
const
noncopyable
&) {
return
*
this
; }
60
};
61
62
class
CudaBase
:
public
noncopyable
{
63
public
:
64
CudaBase
() : _ref(0) { }
65
virtual
~CudaBase
() { }
66
virtual
long
AddRef
() {
67
// return BOOST_INTERLOCKED_INCREMENT(&_ref);
68
return
++_ref;
69
}
70
virtual
void
Release
() {
71
// if(!BOOST_INTERLOCKED_DECREMENT(&_ref)) delete this;
72
if
(!--_ref)
delete
this
;
73
}
74
private
:
75
long
_ref;
76
};
77
78
inline
long
intrusive_ptr_add_ref
(
CudaBase
* base) {
79
return
base->
AddRef
();
80
}
81
82
inline
void
intrusive_ptr_release
(
CudaBase
* base) {
83
base->
Release
();
84
}
85
86
template
<
typename
T>
87
class
intrusive_ptr
{
88
public
:
89
intrusive_ptr
() : _p(0) { }
90
explicit
intrusive_ptr
(T* p) : _p(p) {
91
if
(p)
intrusive_ptr_add_ref
(p);
92
}
93
intrusive_ptr
(
const
intrusive_ptr<T>
& rhs) : _p(rhs._p) {
94
if
(_p)
intrusive_ptr_add_ref
(_p);
95
}
96
~intrusive_ptr
() {
97
if
(_p)
intrusive_ptr_release
(_p);
98
}
99
intrusive_ptr
&
operator=
(
const
intrusive_ptr
& rhs) {
100
intrusive_ptr
(rhs.
get
()).
swap
(*
this
);
101
return
*
this
;
102
}
103
104
void
reset
(T* p = 0) {
105
intrusive_ptr
(p).swap(*
this
);
106
}
107
T*
release
() {
108
T* p = _p;
109
_p = 0;
110
return
p;
111
}
112
113
T*
get
()
const
{
return
_p; }
114
operator
T*()
const
{
return
_p; }
115
T*
operator->
()
const
{
return
_p; }
116
117
void
swap
(
intrusive_ptr
& rhs) {
118
std::swap
(_p, rhs._p);
119
}
120
private
:
121
T* _p;
122
};
123
124
}
// namespace mgpu
Generated on Wed Feb 25 2015 08:32:49 for NVBIO by
1.8.4