1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SK_REF_CNT_EXT_DEBUG_H_
6#define SK_REF_CNT_EXT_DEBUG_H_
7
8#ifdef SK_REF_CNT_EXT_RELEASE_H_
9#error Only one SkRefCnt should be used.
10#endif
11
12// Alternate implementation of SkRefCnt for Chromium debug builds
13class SK_API SkRefCnt : public SkRefCntBase {
14public:
15  SkRefCnt() : flags_(0) {}
16  void ref() const { SkASSERT(flags_ != AdoptionRequired_Flag); SkRefCntBase::ref(); }
17  void adopted() const { flags_ |= Adopted_Flag; }
18  void requireAdoption() const { flags_ |= AdoptionRequired_Flag; }
19  void deref() const { SkRefCntBase::unref(); }
20private:
21  enum {
22    Adopted_Flag = 0x1,
23    AdoptionRequired_Flag = 0x2,
24  };
25
26  mutable int flags_;
27};
28
29// Bootstrap for Blink's WTF::RefPtr
30
31namespace WTF {
32  inline void adopted(const SkRefCnt* object) {
33    if (!object)
34      return;
35    object->adopted();
36  }
37  inline void requireAdoption(const SkRefCnt* object) {
38    if (!object)
39      return;
40    object->requireAdoption();
41  }
42};
43
44using WTF::adopted;
45using WTF::requireAdoption;
46
47#endif
48
49