File: bit_cast.h

package info (click to toggle)
etlcpp 20.39.4%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 18,232 kB
  • sloc: cpp: 245,721; ansic: 10,254; sh: 1,481; asm: 301; python: 281; makefile: 24
file content (33 lines) | stat: -rw-r--r-- 957 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
#pragma once

#include "platform.h"

template <typename TDestination, typename TSource>
typename etl::enable_if<(sizeof(TDestination) == sizeof(TSource))   && 
                         etl::is_trivially_copyable<TSource>::value && 
                         etl::is_trivially_copyable<TDestination>::value, TDestination>::type
  bit_cast(const TSource& source) ETL_NOEXCEPT
{
  TDestination destination;

  memcpy(&destination, &source, sizeof(TDestination));

  return destination;
}

template <typename TDestination, typename TSource>
ETL_CONSTEXPR
typename etl::enable_if<(sizeof(TDestination) == sizeof(TSource))   &&
                         etl::is_trivially_copyable<TSource>::value &&
                         etl::is_trivially_copyable<TDestination>::value, TDestination>::type
  bit_cast(const TSource& source) ETL_NOEXCEPT
{
  TDestination destination;

  __builtin_memcpy(&destination, &source, sizeof(TDestination));

  return destination;
}