File: Has_conversion.h

package info (click to toggle)
cgal 6.1.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 144,952 kB
  • sloc: cpp: 811,597; ansic: 208,576; sh: 493; python: 411; makefile: 286; javascript: 174
file content (78 lines) | stat: -rw-r--r-- 2,358 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
// Copyright (c) 2017 GeometryFactory (France).
// All rights reserved.
//
// This file is part of CGAL (www.cgal.org)
//
// $URL: https://github.com/CGAL/cgal/blob/v6.1.1/Kernel_23/include/CGAL/Has_conversion.h $
// $Id: include/CGAL/Has_conversion.h 08b27d3db14 $
// SPDX-License-Identifier: LGPL-3.0-or-later OR LicenseRef-Commercial
//
// Author(s)     : Mael Rouxel-Labbé

#ifndef CGAL_HAS_CONVERSION_H
#define CGAL_HAS_CONVERSION_H

#include <CGAL/Cartesian_converter.h>
#include <CGAL/Homogeneous_converter.h>
#include <CGAL/representation_tags.h>

namespace CGAL {

namespace internal {

template<typename K1, typename K2, typename Rep = typename K1::Rep_tag /* Cartesian_tag */>
struct Converter_selector
{
  static_assert(std::is_same<typename K1::Rep_tag,
                             typename K2::Rep_tag>::value,
                             "Kernels must have the same representation");

  typedef CGAL::Cartesian_converter<K1, K2> type;
};

template<typename K1, typename K2>
struct Converter_selector<K1, K2, Homogeneous_tag>
{
  static_assert(std::is_same<typename K1::Rep_tag,
                             typename K2::Rep_tag>::value,
                             "Kernels must have the same representation");

  typedef CGAL::Homogeneous_converter<K1, K2> type;
};

} // namespace internal

/// Check whether Cartesian/Homogeneous_converter<K1, K2> provides either
/// of the following conversions:
///
///  -- K2T operator()(const K1T& ) const
///  -- const K2T& operator()(const K1T& ) const
///
/// \pre K1 and K2 are kernels with the same representation tag
/// \pre K1T is a typedef in K1
/// \pre K2T is a typedef in K2
template<typename K1, typename K2, typename K1T, typename K2T>
class Has_conversion
{
  typedef char one;
  typedef struct { char arr[2]; } two;

  template<typename U, U>
  struct Wrapper { };

  template<typename CC, typename T1, typename T2>
  static one test(Wrapper<T2 (CC::*)(const T1&) const, &CC::operator()>*);
  template<typename CC, typename T1, typename T2>
  static one test(Wrapper<const T2& (CC::*)(const T1&) const, &CC::operator()>*);

  template<typename CC, typename T1, typename T2>
  static two test(...);

public:
  static const bool value =
    sizeof(test<typename internal::Converter_selector<K1, K2>::type, K1T, K2T >(0)) == 1;
};

} // namespace CGAL

#endif // CGAL_HAS_CONVERSION_H