Initial commit of OpenSPARC T2 design and verification files.
[OpenSPARC-T2-DV] / verif / model / pcie / pcie_common / packetRefCount.hpp
CommitLineData
86530b38
AT
1// ========== Copyright Header Begin ==========================================
2//
3// OpenSPARC T2 Processor File: packetRefCount.hpp
4// Copyright (C) 1995-2007 Sun Microsystems, Inc. All Rights Reserved
5// 4150 Network Circle, Santa Clara, California 95054, U.S.A.
6//
7// * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
8//
9// This program is free software; you can redistribute it and/or modify
10// it under the terms of the GNU General Public License as published by
11// the Free Software Foundation; version 2 of the License.
12//
13// This program is distributed in the hope that it will be useful,
14// but WITHOUT ANY WARRANTY; without even the implied warranty of
15// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16// GNU General Public License for more details.
17//
18// You should have received a copy of the GNU General Public License
19// along with this program; if not, write to the Free Software
20// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21//
22// For the avoidance of doubt, and except that if any non-GPL license
23// choice is available it will apply instead, Sun elects to use only
24// the General Public License version 2 (GPLv2) at this time for any
25// software where a choice of GPL license versions is made
26// available with the language indicating that GPLv2 or any later version
27// may be used, or where a choice of which version of the GPL is applied is
28// otherwise unspecified.
29//
30// Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
31// CA 95054 USA or visit www.sun.com if you need additional information or
32// have any questions.
33//
34// ========== Copyright Header End ============================================
35#ifndef INC_packetRefCount_hpp__
36#define INC_packetRefCount_hpp__
37
38#include <iostream.h>
39# include "pcie_common/config.hpp"
40
41namespace pcie {
42
43 class packet;
44
45 struct packetRef
46 {
47 packet* const ptr;
48 unsigned int count;
49 uint32 ref_id;
50 static int ref_id_ctr;
51
52 packetRef(packet* p);
53 ~packetRef();
54 packetRef* increment()
55 {
56 ++count;
57 return this;
58 }
59 bool decrement()
60 {
61 return (--count==0);
62 }
63
64 static packetRef* getRef(const packet* p);
65
66 private:
67 packetRef( const packetRef& );
68 packetRef& operator=( const packetRef& );
69 };
70
71
72 template<class T>
73 class packetRefCount
74 {
75 private:
76 packetRef* ref;
77
78 public:
79 packetRefCount(const packet* p=0)
80 : ref(p ? packetRef::getRef(p) : 0)
81 {
82 }
83 packetRefCount(const packetRefCount<T>& other)
84 : ref(other.ref ? other.ref->increment() : 0)
85 {
86 }
87 ~packetRefCount()
88 {
89 if (ref && ref->decrement()) {
90 delete ref;
91 }
92 }
93 packetRefCount<T>& operator=(packet* other)
94 {
95 packetRef* tmp = packetRef::getRef(other);
96
97 if (ref && ref->decrement()) {
98
99 delete ref;
100 }
101 ref=tmp;
102
103 return *this;
104 }
105 packetRefCount<T>& operator=(const packetRefCount<T>& other)
106 {
107 if( other.ref != ref )
108 {
109 packetRef* tmp = other.ref ? other.ref->increment() : 0;
110
111 if (ref && ref->decrement()) {
112 delete ref;
113 }
114
115 ref=tmp;
116 }
117 return *this;
118 }
119
120 operator T* () const { return ref ? static_cast<T*>(ref->ptr) : 0; }
121 T* operator->() const { return ref ? static_cast<T*>(ref->ptr) : 0; }
122 T* get() const { return ref ? static_cast<T*>(ref->ptr) : 0; }
123 };
124
125 typedef packetRefCount<packet> RefPacket;
126
127}
128
129#endif //INC_packetRefCount_hpp__