https://mooseframework.inl.gov
CastUniquePointer.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://mooseframework.inl.gov
3 //*
4 //* All rights reserved, see COPYRIGHT for full restrictions
5 //* https://github.com/idaholab/moose/blob/master/COPYRIGHT
6 //*
7 //* Licensed under LGPL 2.1, please see LICENSE for details
8 //* https://www.gnu.org/licenses/lgpl-2.1.html
9 
10 #pragma once
11 
18 #include <memory>
19 
20 template <typename T_DEST, typename T_SRC, typename T_DELETER>
21 std::unique_ptr<T_DEST, T_DELETER>
22 dynamic_pointer_cast(std::unique_ptr<T_SRC, T_DELETER> & src)
23 {
24  if (!src)
25  return std::unique_ptr<T_DEST, T_DELETER>(nullptr);
26 
27  T_DEST * dest_ptr = dynamic_cast<T_DEST *>(src.get());
28  if (!dest_ptr)
29  return std::unique_ptr<T_DEST, T_DELETER>(nullptr);
30 
31  std::unique_ptr<T_DEST, T_DELETER> dest_temp(dest_ptr, std::move(src.get_deleter()));
32 
33  src.release();
34 
35  return dest_temp;
36 }
37 
38 template <typename T_DEST, typename T_SRC, typename T_DELETER>
39 std::unique_ptr<T_DEST, T_DELETER>
40 dynamic_pointer_cast(std::unique_ptr<T_SRC, T_DELETER> && src)
41 {
42  if (!src)
43  return std::unique_ptr<T_DEST, T_DELETER>(nullptr);
44 
45  T_DEST * dest_ptr = dynamic_cast<T_DEST *>(src.get());
46  if (!dest_ptr)
47  return std::unique_ptr<T_DEST, T_DELETER>(nullptr);
48 
49  std::unique_ptr<T_DEST, T_DELETER> dest_temp(dest_ptr, std::move(src.get_deleter()));
50 
51  src.release();
52 
53  return dest_temp;
54 }
55 
56 template <typename T_DEST, typename T_SRC>
57 std::unique_ptr<T_DEST>
58 dynamic_pointer_cast(std::unique_ptr<T_SRC> & src)
59 {
60  if (!src)
61  return std::unique_ptr<T_DEST>(nullptr);
62 
63  T_DEST * dest_ptr = dynamic_cast<T_DEST *>(src.get());
64  if (!dest_ptr)
65  return std::unique_ptr<T_DEST>(nullptr);
66 
67  std::unique_ptr<T_DEST> dest_temp(dest_ptr);
68 
69  src.release();
70 
71  return dest_temp;
72 }
73 
74 template <typename T_DEST, typename T_SRC>
75 std::unique_ptr<T_DEST>
76 dynamic_pointer_cast(std::unique_ptr<T_SRC> && src)
77 {
78  if (!src)
79  return std::unique_ptr<T_DEST>(nullptr);
80 
81  T_DEST * dest_ptr = dynamic_cast<T_DEST *>(src.get());
82  if (!dest_ptr)
83  return std::unique_ptr<T_DEST>(nullptr);
84 
85  std::unique_ptr<T_DEST> dest_temp(dest_ptr);
86 
87  src.release();
88 
89  return dest_temp;
90 }
std::unique_ptr< T_DEST, T_DELETER > dynamic_pointer_cast(std::unique_ptr< T_SRC, T_DELETER > &src)
These are reworked from https://stackoverflow.com/a/11003103.