endianhelper.h 2.54 KB
Newer Older
1
2
// ================================================================================================
// 
schultezub's avatar
schultezub committed
3
// This file is part of the CAMPVis Software Framework.
4
// 
5
// If not explicitly stated otherwise: Copyright (C) 2012-2014, all rights reserved,
schultezub's avatar
schultezub committed
6
//      Christian Schulte zu Berge <christian.szb@in.tum.de>
7
//      Chair for Computer Aided Medical Procedures
8
9
//      Technische Universitaet Muenchen
//      Boltzmannstr. 3, 85748 Garching b. Muenchen, Germany
10
// 
schultezub's avatar
schultezub committed
11
// For a full list of authors and contributors, please refer to the file "AUTHORS.txt".
12
// 
13
14
15
16
// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 
// except in compliance with the License. You may obtain a copy of the License at
// 
// http://www.apache.org/licenses/LICENSE-2.0
17
// 
18
19
20
21
// Unless required by applicable law or agreed to in writing, software distributed under the 
// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 
// either express or implied. See the License for the specific language governing permissions 
// and limitations under the License.
22
23
24
// 
// ================================================================================================

schultezub's avatar
schultezub committed
25
26
27
#ifndef endianhelper_h__
#define endianhelper_h__

28
29
#include "cgt/logmanager.h"
#include "cgt/types.h"
schultezub's avatar
schultezub committed
30

31
32
#include "core/coreapi.h"

33
#include <utility>
schultezub's avatar
schultezub committed
34

schultezub's avatar
schultezub committed
35
namespace campvis {
schultezub's avatar
schultezub committed
36
37
38
39

    /**
     * Helper struct for handling endianess.
     **/
40
    struct CAMPVIS_CORE_API EndianHelper {
schultezub's avatar
schultezub committed
41
42
        /// Type of Endianness
        enum Endianness {
schultezub's avatar
schultezub committed
43
44
            IS_LITTLE_ENDIAN,  ///< little endian
            IS_BIG_ENDIAN      ///< big endian
schultezub's avatar
schultezub committed
45
46
47
48
49
50
51
52
53
54
55
        };

        /**
         * Returns the Endianess of the local system.
         * \return Endianess of this very system.
         */
        static Endianness getLocalEndianness() {
            union {
                uint32_t i;
                char c[4];
            } bint = {0x01020304};
schultezub's avatar
schultezub committed
56
            return (bint.c[0] == 1) ? IS_BIG_ENDIAN : IS_LITTLE_ENDIAN;
schultezub's avatar
schultezub committed
57
58
59
        }

        /**
60
61
62
         * Performs in-place endian-swapping of value pointed to by \a value, supposing its size to be \a N bytes.
         * \param   value   Pointer to the value to be endian-swapped.
         * \tparam  N       Number of bytes of the value to be swapped.
schultezub's avatar
schultezub committed
63
         */
64
65
66
67
68
        template<size_t N>
        static inline void swapEndian(char* value) {
            for (size_t i = 0; i < N/2; ++i) {
                std::swap(value[i], value[N-i-1]);
            }
schultezub's avatar
schultezub committed
69
70
71
72
73
        }

    };
}

schultezub's avatar
schultezub committed
74
#endif