54 template<
class T>
friend class make_gc;
70 void *
start() noexcept {
return (
void *)(
this+1); }
75 void *
end() noexcept {
return end_; }
80 void (*destructor)(
void *s,
void *e);
86 std::atomic<gc_base_ptr *>
first;
100 gc_object(
void *e,
void (*d)(
void *,
void *)) noexcept;
120 std::atomic<gc_base_ptr *>
next;
152 template<
class U>
friend class gc_ptr;
218 T *
get()
const noexcept {
return ptr;}
221 operator T*()
const noexcept {
return ptr; }
264 template <
class... Args>
make_gc(Args&&... args)
267 char *mem=(
char*)::
operator new(
sizeof(
gc_object)+
sizeof(T));
272 if(gc_counter--==0) {
280 [](
void *s,
void *e) { T *t=(T*)s; t->~T(); });
288 all_objects.push_back(new_object);
302 new(new_object->
start()) T(std::forward<Args>(args)...);
328 char *mem=(
char*)::
operator new(
sizeof(
gc_object)+size*
sizeof(T));
333 if(gc_counter--==0) {
340 [](
void *s,
void *e) {
for(T *t=(T*)e;--t>=s;) t->~T(); });
348 all_objects.push_back(new_object);
357 T *start=(T*)new_object->
start();
358 T *end=(T*)new_object->
end();
364 for(i=start;i!=end;i++)
new(i) T();
367 for(T *j=i;--j>=start;) j->~T();
394 return lhs.get()==rhs.get();
424 return lhs.get()!=rhs.get();
452 template <
class T,
class U>
bool operator<(const gc_ptr<T>& lhs,
const gc_ptr<U>& rhs) noexcept
454 return lhs.
get()<rhs.get();
462 template <
class T>
bool operator<(const gc_ptr<T>& lhs, nullptr_t n) noexcept
472 template <
class T>
bool operator<(nullptr_t n, const gc_ptr<T>& rhs) noexcept
482 template <
class T>
bool operator<=(const gc_ptr<T>& lhs,
const gc_ptr<T>& rhs) noexcept
484 return lhs.
get()<=rhs.get();
492 template <
class T>
bool operator<=(const gc_ptr<T>& lhs, nullptr_t n) noexcept
502 template <
class T>
bool operator<=(nullptr_t n, const gc_ptr<T>& rhs) noexcept
514 return lhs.get()>rhs.get();
544 return lhs.get()>=rhs.get();
605 return a.get()-b.get();
gc_ptr & operator=(gc_ptr &&o)
Definition: gc_ptr.h:202
void reset()
Definition: gc_ptr.h:233
T * ptr
Definition: gc_ptr.h:154
gc_base_ptr(gc_object *c=nullptr)
bool mark
Definition: gc_ptr.h:89
gc_ptr & operator=(nullptr_t)
Definition: gc_ptr.h:209
gc_ptr(gc_ptr &&o)
Definition: gc_ptr.h:172
make_gc(Args &&...args)
Definition: gc_ptr.h:264
gc_ptr< T > operator+(const gc_ptr< T > &a, const U &b) noexcept
Definition: gc_ptr.h:573
std::atomic< gc_object * > object
Definition: gc_ptr.h:121
void * end() noexcept
Definition: gc_ptr.h:75
gc_ptr(nullptr_t)
Definition: gc_ptr.h:162
T & operator[](int idx) const noexcept
Definition: gc_ptr.h:230
gc_ptr< T > & operator+=(const U &z) noexcept
Definition: gc_ptr.h:249
std::atomic< gc_base_ptr * > first
Definition: gc_ptr.h:86
gc_base_ptr(const gc_base_ptr &o)
Definition: gc_ptr.h:128
gc_ptr< T > reinterpret_pointer_cast(const gc_ptr< U > &p) noexcept
Definition: gc_ptr.h:641
std::atomic< int > root_ref_cnt
Definition: gc_ptr.h:83
gc_ptr< T > operator++(int) noexcept
Definition: gc_ptr.h:242
gc_ptr< T > & operator++() noexcept
Definition: gc_ptr.h:236
std::atomic< gc_base_ptr * > next
Definition: gc_ptr.h:120
make_gc(unsigned size)
Definition: gc_ptr.h:325
gc_ptr< T > pointer_cast(const gc_ptr< U > &p) noexcept
Definition: gc_ptr.h:649
T * get() const noexcept
Definition: gc_ptr.h:218
void * end_
Definition: gc_ptr.h:63
bool operator>=(const gc_ptr< T > &lhs, const gc_ptr< T > &rhs) noexcept
Definition: gc_ptr.h:542
T * operator->() const noexcept
Definition: gc_ptr.h:227
thread_local gc_object * current
gc_ptr< T > & operator-=(const U &z) noexcept
Definition: gc_ptr.h:252
gc_ptr(const gc_ptr &o)
Definition: gc_ptr.h:167
bool operator!=(const gc_ptr< T > &lhs, const gc_ptr< U > &rhs) noexcept
Definition: gc_ptr.h:422
std::vector< gc_object * > all_objects
bool operator==(const gc_ptr< T > &lhs, const gc_ptr< U > &rhs) noexcept
Definition: gc_ptr.h:392
gc_ptr< T > static_pointer_cast(const gc_ptr< U > &p) noexcept
Definition: gc_ptr.h:617
gc_ptr & operator=(const gc_ptr &o)
Definition: gc_ptr.h:193
gc_ptr< T > operator-(const gc_ptr< T > &a, const U &b) noexcept
Definition: gc_ptr.h:593
enum gc_base_ptr::PtrType type
bool operator>(const gc_ptr< T > &lhs, const gc_ptr< T > &rhs) noexcept
Definition: gc_ptr.h:512
PtrType
Definition: gc_ptr.h:115
gc_ptr(const gc_base_ptr &o, T *p)
Definition: gc_ptr.h:179
void * start() noexcept
Definition: gc_ptr.h:70
gc_ptr< T > const_pointer_cast(const gc_ptr< U > &p) noexcept
Definition: gc_ptr.h:633
gc_ptr(const gc_ptr< U > &o)
Definition: gc_ptr.h:185
gc_ptr()
Definition: gc_ptr.h:159
gc_ptr< T > & operator--() noexcept
Definition: gc_ptr.h:239
void operator=(nullptr_t)
T & operator*() const noexcept
Definition: gc_ptr.h:224
gc_ptr< T > dynamic_pointer_cast(const gc_ptr< U > &p) noexcept
Definition: gc_ptr.h:625
gc_ptr< T > operator--(int) noexcept
Definition: gc_ptr.h:245