www.mooseframework.org
CastUniquePointer.h
Go to the documentation of this file.
1 //* This file is part of the MOOSE framework
2 //* https://www.mooseframework.org
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 
17 #include <memory>
18 
19 template <typename T_DEST, typename T_SRC, typename T_DELETER>
20 std::unique_ptr<T_DEST, T_DELETER>
21 dynamic_pointer_cast(std::unique_ptr<T_SRC, T_DELETER> & src)
22 {
23  if (!src)
24  return std::unique_ptr<T_DEST, T_DELETER>(nullptr);
25 
26  T_DEST * dest_ptr = dynamic_cast<T_DEST *>(src.get());
27  if (!dest_ptr)
28  return std::unique_ptr<T_DEST, T_DELETER>(nullptr);
29 
30  std::unique_ptr<T_DEST, T_DELETER> dest_temp(dest_ptr, std::move(src.get_deleter()));
31 
32  src.release();
33 
34  return dest_temp;
35 }
36 
37 template <typename T_DEST, typename T_SRC, typename T_DELETER>
38 std::unique_ptr<T_DEST, T_DELETER>
39 dynamic_pointer_cast(std::unique_ptr<T_SRC, T_DELETER> && src)
40 {
41  if (!src)
42  return std::unique_ptr<T_DEST, T_DELETER>(nullptr);
43 
44  T_DEST * dest_ptr = dynamic_cast<T_DEST *>(src.get());
45  if (!dest_ptr)
46  return std::unique_ptr<T_DEST, T_DELETER>(nullptr);
47 
48  std::unique_ptr<T_DEST, T_DELETER> dest_temp(dest_ptr, std::move(src.get_deleter()));
49 
50  src.release();
51 
52  return dest_temp;
53 }
54 
55 template <typename T_DEST, typename T_SRC>
56 std::unique_ptr<T_DEST>
57 dynamic_pointer_cast(std::unique_ptr<T_SRC> & src)
58 {
59  if (!src)
60  return std::unique_ptr<T_DEST>(nullptr);
61 
62  T_DEST * dest_ptr = dynamic_cast<T_DEST *>(src.get());
63  if (!dest_ptr)
64  return std::unique_ptr<T_DEST>(nullptr);
65 
66  std::unique_ptr<T_DEST> dest_temp(dest_ptr);
67 
68  src.release();
69 
70  return dest_temp;
71 }
72 
73 template <typename T_DEST, typename T_SRC>
74 std::unique_ptr<T_DEST>
75 dynamic_pointer_cast(std::unique_ptr<T_SRC> && src)
76 {
77  if (!src)
78  return std::unique_ptr<T_DEST>(nullptr);
79 
80  T_DEST * dest_ptr = dynamic_cast<T_DEST *>(src.get());
81  if (!dest_ptr)
82  return std::unique_ptr<T_DEST>(nullptr);
83 
84  std::unique_ptr<T_DEST> dest_temp(dest_ptr);
85 
86  src.release();
87 
88  return dest_temp;
89 }
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.