From d17ce57e291e29d0b3d89c9973bcc468a4e3d504 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Fri, 15 Mar 2019 09:10:21 +0100
Subject: [PATCH] COMP: update endian macros. More universal syntax, less
 clutter.

---
 src/OpenFOAM/primitives/endian/endian.H  | 57 +++++-------------------
 src/OpenFOAM/primitives/endian/endianI.H |  7 ++-
 2 files changed, 14 insertions(+), 50 deletions(-)

diff --git a/src/OpenFOAM/primitives/endian/endian.H b/src/OpenFOAM/primitives/endian/endian.H
index cce070c197..573871827a 100644
--- a/src/OpenFOAM/primitives/endian/endian.H
+++ b/src/OpenFOAM/primitives/endian/endian.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2016 OpenCFD Ltd.
+    \\  /    A nd           | Copyright (C) 2016-2019 OpenCFD Ltd.
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -25,60 +25,33 @@ Description
     Help with architecture-specific aspects.
 
     Defines WM_BIG_ENDIAN or WM_LITTLE_ENDIAN as well as providing a
-    few runtime methods. Primarily used as a namespace, but provided
-    as a class for possible future expansion.
+    few runtime methods. Primarily used as a namespace, but defined as
+    a class to allow pTraits specialization.
 
 SourceFiles
     endianI.H
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef foamEndian_H  // prefixed with 'foam' to avoid potential collisions
+#ifndef foamEndian_H  // Prefixed with 'foam' to avoid any name clashes
 #define foamEndian_H
 
 #include <cstdint>
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-#ifdef darwin
-    #include <machine/endian.h>
-#elif defined __GNUC__
-    #include <endian.h>
-#elif defined __mips
-    #include <standards.h>
-    #include <sys/endian.h>
-#endif
-
-#ifdef __BYTE_ORDER
-    #if (__BYTE_ORDER == __LITTLE_ENDIAN)
+#ifdef __BYTE_ORDER__
+    // Clang, Gcc, Icc, Pgi
+    #if (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
         #define WM_LITTLE_ENDIAN
-    #elif (__BYTE_ORDER == __BIG_ENDIAN)
+    #elif (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
         #define WM_BIG_ENDIAN
     #else
-        #error "__BYTE_ORDER defined, but not __LITTLE_ENDIAN or __BIG_ENDIAN."
-    #endif
-#elif defined(__LITTLE_ENDIAN)  \
-   || defined(_LITTLE_ENDIAN)   \
-   || defined(LITTLE_ENDIAN)
-   #define WM_LITTLE_ENDIAN
-#elif defined(__BIG_ENDIAN)     \
-   || defined(_BIG_ENDIAN)      \
-   || defined(BIG_ENDIAN)
-   #define WM_BIG_ENDIAN
-#endif
-
-// Special handling for OS-X
-#ifdef __DARWIN_BYTE_ORDER
-    #if (__DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN)
-        #define WM_BIG_ENDIAN
-        #undef  WM_LITTLE_ENDIAN
-    #elif (__DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN)
-        #define WM_LITTLE_ENDIAN
-        #undef  WM_BIG_ENDIAN
+        #error "__BYTE_ORDER__ is not BIG or LITTLE endian"
     #endif
 #endif
 
-// Could also downgrade to a warning, but then user always needs runtime check.
+// Could downgrade to a warning, but then user always needs runtime check.
 #if !defined(WM_BIG_ENDIAN) && !defined(WM_LITTLE_ENDIAN)
     #error "Cannot determine BIG or LITTLE endian."
     #error "Please add to compilation options"
@@ -95,17 +68,9 @@ namespace Foam
 
 class endian
 {
-    // Private Member Functions
-
-        //- No copy construct
-        endian(const endian&) = delete;
-
-        //- No copy assignment
-        void operator=(const endian&) = delete;
-
 public:
 
-    // Public data
+    // Public Methods
 
         //- Runtime check for big endian.
         inline static bool isBig();
diff --git a/src/OpenFOAM/primitives/endian/endianI.H b/src/OpenFOAM/primitives/endian/endianI.H
index ca869ce0c2..a810f695af 100644
--- a/src/OpenFOAM/primitives/endian/endianI.H
+++ b/src/OpenFOAM/primitives/endian/endianI.H
@@ -23,13 +23,12 @@ License
 
 \*---------------------------------------------------------------------------*/
 
-#include "endian.H"
-
 #ifdef __GNUC__
     #define USE_BUILTIN_BYTESWAP
 #else
     #undef USE_BUILTIN_BYTESWAP
 #endif
+
 // for Debugging:
 // #undef USE_BUILTIN_BYTESWAP
 
@@ -70,7 +69,7 @@ inline uint32_t Foam::endian::swap32(uint32_t u)
       | (((u) & 0x000000ff) << 24)      // 3 <- 0
     );
 
-    // alternative formulation
+    // Alternative formulation
     //
     // u = ((u<<8) & 0xFF00FF00) | ((u>>8) & 0x00FF00FF);
     // u = (u>>16) | (u<<16);
@@ -96,7 +95,7 @@ inline uint64_t Foam::endian::swap64(uint64_t u)
       | (((u) & 0x00000000000000ffull) << 56)   // 7 <- 0
     );
 
-    // alternative formulation
+    // Alternative formulation
     /*
      u = ((u<< 8) & 0xFF00FF00FF00FF00ull) | ((u>> 8) & 0x00FF00FF00FF00FFull);
      u = ((u<<16) & 0xFFFF0000FFFF0000ull) | ((u>>16) & 0x0000FFFF0000FFFFull);
-- 
GitLab