SkInstCnt.h revision 977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9
1528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org/*
2528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org * Copyright 2012 Google Inc.
3528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org *
4528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org * Use of this source code is governed by a BSD-style license that can be
5528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org * found in the LICENSE file.
6528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org */
7528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
8528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
9528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#ifndef SkInstCnt_DEFINED
10528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#define SkInstCnt_DEFINED
11528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
12528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org/*
13528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org * The instance counting system consists of three macros that create the
14528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org * instance counting machinery. A class is added to the system by adding:
15528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org *   DECLARE_INST_COUNT at the top of its declaration
16528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org *   DEFINE_INST_COUNT at the top of its .cpp file
17528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org *   and a PRINT_INST_COUNT line at the application's end point
18528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org */
19528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#ifdef SK_DEBUG
20528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#define DECLARE_INST_COUNT                  \
21528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    class SkInstanceCountHelper {           \
22528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    public:                                 \
23528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        SkInstanceCountHelper() {           \
24528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org            gInstanceCount++;               \
25528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        }                                   \
26528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                            \
27528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        ~SkInstanceCountHelper() {          \
28528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org            gInstanceCount--;               \
29528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        }                                   \
30528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                            \
31528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        static int32_t gInstanceCount;      \
32528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    } fInstanceCountHelper;                 \
33528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                                            \
34528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    static int32_t GetInstanceCount() {     \
35528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org        return SkInstanceCountHelper::gInstanceCount;   \
36528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    }
37528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
38528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#define DEFINE_INST_COUNT(className)        \
39528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    int32_t className::SkInstanceCountHelper::gInstanceCount = 0;
40528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
41528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#define PRINT_INST_COUNT(className)         \
42528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    SkDebugf("Leaked %s objects: %d\n",     \
43528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                  #className,               \
44528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org                  className::GetInstanceCount());
45528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#else
46528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#define DECLARE_INST_COUNT
47528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#define DEFINE_INST_COUNT(className)
48528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#define PRINT_INST_COUNT(className)
49528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#endif
50528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org
51528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org#endif // SkInstCnt_DEFINED
52528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org