summaryrefslogtreecommitdiffstats
path: root/src/Authoring/Common/Code/Qt3DSObjectCounter.h
blob: 6587e3cebf57d6bfe8dc2df7413b522cbb4837f5 (plain)
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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/****************************************************************************
**
** Copyright (C) 1999-2002 NVIDIA Corporation.
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt 3D Studio.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

//==============================================================================
//	Prefix
//==============================================================================
#ifndef __QT3DS_OBJECTCOUNTER_H__
#define __QT3DS_OBJECTCOUNTER_H__

//==============================================================================
//	Includes
//==============================================================================
#include <vector>
#include <string.h>
#include <QDebug>

//==============================================================================
//	Forwards
//==============================================================================
class Qt3DSObjectCounter;

//==============================================================================
//	Typedefs
//==============================================================================
typedef std::vector<Qt3DSObjectCounter *> TObjectCounterTracker;

//==============================================================================
//	Constants
//==============================================================================

// If defined, track the object counts
#ifdef TRACK_OBJECT_COUNTS

#define DEFINE_OBJECT_COUNTER(classname) static Qt3DSObjectCounter s_ObjectCounter##classname;

#define IMPLEMENT_OBJECT_COUNTER(classname)                                                        \
    Qt3DSObjectCounter classname::s_ObjectCounter##classname(#classname, sizeof(classname));

#define ADDTO_OBJECT_COUNTER(classname) classname::s_ObjectCounter##classname.Add();

#define REMOVEFROM_OBJECT_COUNTER(classname) classname::s_ObjectCounter##classname.Remove();

#define GET_OBJECT_COUNTER_COUNT(classname) (classname::s_ObjectCounter##classname.m_ObjectCount)

#define GET_OBJECT_COUNTER_SIZE(classname) (classname::s_ObjectCounter##classname.m_ObjectSize)

#define DEFINE_OBJECT_COUNTER_TRACKER(tracktype)                                                   \
    extern TObjectCounterTracker s_ObjectCounterTracker##tracktype;

#define IMPLEMENT_OBJECT_COUNTER_TRACKER(tracktype)                                                \
    TObjectCounterTracker s_ObjectCounterTracker##tracktype;

#define TRACK_OBJECT_COUNTER(tracktype, classname)                                                 \
    s_ObjectCounterTracker##tracktype.push_back(&classname::s_ObjectCounter##classname);

#define GET_TRACK_OBJECT_COUNTER(tracktype) s_ObjectCounterTracker##tracktype

// If not defined, do nothing
#else

#define DEFINE_OBJECT_COUNTER(classname)
#define IMPLEMENT_OBJECT_COUNTER(classname)
#define ADDTO_OBJECT_COUNTER(classname)
#define REMOVEFROM_OBJECT_COUNTER(classname)
#define GET_OBJECT_COUNTER_COUNT(classname)
#define DEFINE_OBJECT_COUNTER_TRACKER(tracktype)
#define IMPLEMENT_OBJECT_COUNTER_TRACKER(tracktype)
#define TRACK_OBJECT_COUNTER(tracktype, classname)
#define GET_TRACK_OBJECT_COUNTER(tracktype)

#endif

//==============================================================================
//	Class
//==============================================================================

//==============================================================================
/**
 *	@class	Qt3DSObjectCounter
 *	@brief	This class is used to track that object have been released.
 *
 *	Use the macros to make the feature easy.
 *	The macros define a static variable. Each time the object is constructed,
 *	the count on the static variable in incremented, and decremented when it
 *	is destructed. When the static variable is destroyed, object counts are
 *	dumped out to the debugger.
 */
class Qt3DSObjectCounter
{
    //==============================================================================
    //	Enumerations
    //==============================================================================

    //==============================================================================
    //	Fields
    //==============================================================================

public:
    long m_ObjectCount;
    char m_ObjectName[256];
    long m_ObjectSize;

private:
    static TObjectCounterTracker s_ObjectVector;

    //==============================================================================
    //	Methods
    //==============================================================================

public:
    Qt3DSObjectCounter(const char *inName, long inClassSize)
        : m_ObjectCount(0)
        , m_ObjectSize(inClassSize)
    {
        ::strncpy(m_ObjectName, inName, sizeof(m_ObjectName) - 1);
        m_ObjectName[::strlen(inName)] = 0;

        s_ObjectVector.push_back(this);
    }

    ~Qt3DSObjectCounter()
    {
        if (m_ObjectCount > 0) {
            qDebug() << "\t. . . with " << m_ObjectCount << "unreleased " << m_ObjectName
                     << " objects.";
        }

        else if (m_ObjectCount < 0) {
            qDebug() << "\t. . . object counting error for " << m_ObjectName << " ("
                     << m_ObjectCount << ").";
        }
        if (s_ObjectVector.size()) {
            TObjectCounterTracker::iterator theBegin = s_ObjectVector.begin();
            TObjectCounterTracker::iterator theEnd = s_ObjectVector.end();
            for (; theBegin != theEnd; ++theBegin) {
                if (this == *theBegin) {
                    s_ObjectVector.erase(theBegin);
                    break;
                }
            }
        }
    }
    void Add() { m_ObjectCount++; }
    void Remove() { m_ObjectCount--; };
};

#endif // #ifndef __QT3DS_OBJECTCOUNTER_H__