SkInstCnt.h revision f6747b0b90b3a270ec7b7bdfdc211cf5c19f28c2
1f6747b0b90b3a270ec7b7bdfdc211cf5c19f28c2robertphillips@google.com/*
2f6747b0b90b3a270ec7b7bdfdc211cf5c19f28c2robertphillips@google.com * Copyright 2012 Google Inc.
3f6747b0b90b3a270ec7b7bdfdc211cf5c19f28c2robertphillips@google.com *
4f6747b0b90b3a270ec7b7bdfdc211cf5c19f28c2robertphillips@google.com * Use of this source code is governed by a BSD-style license that can be
5f6747b0b90b3a270ec7b7bdfdc211cf5c19f28c2robertphillips@google.com * found in the LICENSE file.
6977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com */
7977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com
8977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com
9977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#ifndef SkInstCnt_DEFINED
10977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#define SkInstCnt_DEFINED
11977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com
12977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com/*
13977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com * The instance counting system consists of three macros that create the
14977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com * instance counting machinery. A class is added to the system by adding:
15977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com *   DECLARE_INST_COUNT at the top of its declaration
16977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com *   DEFINE_INST_COUNT at the top of its .cpp file
17977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com *   and a PRINT_INST_COUNT line at the application's end point
18977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com */
19977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#ifdef SK_DEBUG
20977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#define DECLARE_INST_COUNT                  \
21977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com    class SkInstanceCountHelper {           \
22977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com    public:                                 \
23977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com        SkInstanceCountHelper() {           \
24977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com            gInstanceCount++;               \
25977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com        }                                   \
26977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com                                            \
27977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com        ~SkInstanceCountHelper() {          \
28977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com            gInstanceCount--;               \
29977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com        }                                   \
30977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com                                            \
31977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com        static int32_t gInstanceCount;      \
32977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com    } fInstanceCountHelper;                 \
33977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com                                            \
34977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com    static int32_t GetInstanceCount() {     \
35977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com        return SkInstanceCountHelper::gInstanceCount;   \
36977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com    }
37977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com
38977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#define DEFINE_INST_COUNT(className)        \
39977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com    int32_t className::SkInstanceCountHelper::gInstanceCount = 0;
40977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com
41977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#define PRINT_INST_COUNT(className)         \
42977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com    SkDebugf("Leaked %s objects: %d\n",     \
43977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com                  #className,               \
44977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com                  className::GetInstanceCount());
45977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#else
46977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#define DECLARE_INST_COUNT
47977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#define DEFINE_INST_COUNT(className)
48977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#define PRINT_INST_COUNT(className)
49977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#endif
50977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com
51977b9c8af3ef1b9a2fa2a0037cf3734cf2ba13d9robertphillips@google.com#endif // SkInstCnt_DEFINED
52