15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef BASE_MAC_SCOPED_CFTYPEREF_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define BASE_MAC_SCOPED_CFTYPEREF_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <CoreFoundation/CoreFoundation.h>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/mac/scoped_typeref.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace base {
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScopedCFTypeRef<> is patterned after scoped_ptr<>, but maintains ownership
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// of a CoreFoundation object: any object that can be represented as a
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// CFTypeRef.  Style deviations here are solely for compatibility with
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// scoped_ptr<>'s interface, with which everyone is already familiar.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// By default, ScopedCFTypeRef<> takes ownership of an object (in the
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// constructor or in reset()) by taking over the caller's existing ownership
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// claim.  The caller must own the object it gives to ScopedCFTypeRef<>, and
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// relinquishes an ownership claim to that object.  ScopedCFTypeRef<> does not
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// call CFRetain(). This behavior is parameterized by the |OwnershipPolicy|
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// enum. If the value |RETAIN| is passed (in the constructor or in reset()),
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// then ScopedCFTypeRef<> will call CFRetain() on the object, and the initial
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ownership is not changed.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace internal {
295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)struct ScopedCFTypeRefTraits {
315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Retain(CFTypeRef object) {
325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CFRetain(object);
335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  static void Release(CFTypeRef object) {
355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    CFRelease(object);
365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  }
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)};
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}  // namespace internal
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename CFT>
425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ScopedCFTypeRef
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    : public ScopedTypeRef<CFT, internal::ScopedCFTypeRefTraits> {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef CFT element_type;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScopedCFTypeRef(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      CFT object = NULL,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::scoped_policy::OwnershipPolicy policy = base::scoped_policy::ASSUME)
505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : ScopedTypeRef<CFT,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                      internal::ScopedCFTypeRefTraits>(object, policy) {}
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedCFTypeRef(const ScopedCFTypeRef<CFT>& that)
545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : ScopedTypeRef<CFT, internal::ScopedCFTypeRefTraits>(that) {}
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace base
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // BASE_MAC_SCOPED_CFTYPEREF_H_
60