1// Copyright 2012 The Chromium Authors
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "partition_alloc/partition_alloc_base/apple/foundation_util.h"
6
7#include "partition_alloc/partition_alloc_base/check.h"
8
9namespace partition_alloc::internal::base::apple {
10
11#define PA_CF_CAST_DEFN(TypeCF)                                    \
12  template <>                                                      \
13  TypeCF##Ref CFCast<TypeCF##Ref>(const CFTypeRef& cf_val) {       \
14    if (cf_val == NULL) {                                          \
15      return NULL;                                                 \
16    }                                                              \
17    if (CFGetTypeID(cf_val) == TypeCF##GetTypeID()) {              \
18      return (TypeCF##Ref)(cf_val);                                \
19    }                                                              \
20    return NULL;                                                   \
21  }                                                                \
22                                                                   \
23  template <>                                                      \
24  TypeCF##Ref CFCastStrict<TypeCF##Ref>(const CFTypeRef& cf_val) { \
25    TypeCF##Ref rv = CFCast<TypeCF##Ref>(cf_val);                  \
26    PA_BASE_DCHECK(cf_val == NULL || rv);                          \
27    return rv;                                                     \
28  }
29
30PA_CF_CAST_DEFN(CFArray)
31PA_CF_CAST_DEFN(CFBag)
32PA_CF_CAST_DEFN(CFBoolean)
33PA_CF_CAST_DEFN(CFData)
34PA_CF_CAST_DEFN(CFDate)
35PA_CF_CAST_DEFN(CFDictionary)
36PA_CF_CAST_DEFN(CFNull)
37PA_CF_CAST_DEFN(CFNumber)
38PA_CF_CAST_DEFN(CFSet)
39PA_CF_CAST_DEFN(CFString)
40PA_CF_CAST_DEFN(CFURL)
41PA_CF_CAST_DEFN(CFUUID)
42
43#undef PA_CF_CAST_DEFN
44
45}  // namespace partition_alloc::internal::base::apple
46