File: refcount.h

package info (click to toggle)
latte 2.1-1
  • links: PTS
  • area: main
  • in suites: potato
  • size: 2,032 kB
  • ctags: 1,220
  • sloc: sh: 6,802; cpp: 5,771; ansic: 662; perl: 628; makefile: 327; yacc: 195; lisp: 114
file content (74 lines) | stat: -rw-r--r-- 1,949 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
// -*- c++ -*-

// Copyright 1998,1999 Zanshin Inc.                  <http://www.zanshin.com/>

// The contents of this file are subject to the Zanshin Public License Version
// 1.0 (the "License"); you may not use this file except in compliance with the
// License.  You should have received a copy of the License with Latte; see
// the file COPYING.  You may also obtain a copy of the License at
// <http://www.zanshin.com/ZPL.html>.
// 
// Software distributed under the License is distributed on an "AS IS" basis,
// WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
// for the specific language governing rights and limitations under the
// License.
// 
// The Original Code is Latte.
// 
// The Initial Developer of the Original Code is Zanshin, Inc.

#ifndef REFCOUNT_H
# define REFCOUNT_H

#ifndef CONFIGURE_IS_RUNNING
# include <latte-conf.h>
#endif // CONFIGURE_IS_RUNNING
#include <mutable.h>

template <class T>
class Refcounter {
 public:
  Refcounter() : val(0) {}
  explicit Refcounter(T *v) : val(v) { if (val) val->inc_refcount(); }
  Refcounter(const Refcounter<T> &other) : val(other.val) {
    if (val)
      val->inc_refcount();
  }

  ~Refcounter() { if (val) val->dec_refcount(); }

  Refcounter &operator = (const Refcounter<T> &other) {
    if (this != &other) {
      if (other.val)
	other.val->inc_refcount();
      if (val)
	val->dec_refcount();
      val = other.val;
    }
    return *this;
  }

  T *get() const { return val; }

  T &operator * () const { return *val; }
  T *operator -> () const { return val; }

 private:
  T *val;
};

class Refcounted {
 public:
  Refcounted() : refcount(0) {}

  // The dtor is virtual because this may be mixed into virtual classes
  virtual ~Refcounted() {}

  void inc_refcount() const { ++(mutate(refcount)); }
  void dec_refcount() const { if (!--(mutate(refcount))) delete this; }

 private:
  mutable unsigned long refcount;
};

#endif // REFCOUNT_H