From 21142a1d3354b5d4e97a2e160221ae391362e8c1 Mon Sep 17 00:00:00 2001
From: Jan Schlamelcher <dicom@offis.de>
Date: Fri, 4 Jul 2014 12:02:51 +0200
Subject: [PATCH] Fixed OFoptional by introducing OFalign?
--- a/CMake/osconfig.h.in
+++ b/CMake/osconfig.h.in
@@ -1180,4 +1180,7 @@
 /* Define if we are supposed to use STL's system_error */
 #cmakedefine HAVE_STL_SYSTEM_ERROR @HAVE_STL_SYSTEM_ERROR@
 
+/* Define if the compiler supports __declspec(align) */
+#cmakedefine HAVE_DECLSPEC_ALIGN
+
 #endif /* !OSCONFIG_H*/
--- a/config/aclocal.m4
+++ b/config/aclocal.m4
@@ -1971,6 +1971,47 @@
     fi
 ])
 
+AC_DEFUN([AC_CHECK_ALIGNOF],
+[
+    AC_MSG_CHECKING([for __alignof__])
+    AC_LINK_IFELSE(
+    [
+        AC_LANG_SOURCE(
+        [
+            int main(){char c[__alignof__(int)];return 0;}
+        ])
+    ],
+    [dcmtk_have_alignof=[yes]],
+    [dcmtk_have_alignof=[no]]
+    )
+    if test "$dcmtk_have_alignof" = yes; then
+        AC_MSG_RESULT([yes])
+        AC_DEFINE($1,[1],[Define if __alignof__ is available])
+    else
+        AC_MSG_RESULT([no])
+    fi
+])
+
+AC_DEFUN([AC_CHECK_ATTRIBUTE_ALIGNED],
+[
+    AC_MSG_CHECKING([for __attribute__((aligned))])
+    AC_LINK_IFELSE(
+    [
+        AC_LANG_SOURCE(
+        [
+            int main(){__attribute__((aligned(4))) char c[16];return 0;}
+        ])
+    ],
+    [dcmtk_have_attribute_aligned=[yes]],
+    [dcmtk_have_attribute_aligned=[no]]
+    )
+    if test "$dcmtk_have_attribute_aligned" = yes; then
+        AC_MSG_RESULT([yes])
+        AC_DEFINE($1,[1],[Define if __attribute__((aligned)) is available])
+    else
+        AC_MSG_RESULT([no])
+    fi
+])
 
 dnl
 dnl This macro checks if a given preprocessor symbol exists and is a string
--- a/config/configure
+++ b/config/configure
@@ -16924,6 +16924,66 @@
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
 
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __alignof__" >&5
+$as_echo_n "checking for __alignof__... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+            int main(){char c__alignof__(int);return 0;}
+
+
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  dcmtk_have_alignof=yes
+else
+  dcmtk_have_alignof=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    if test "$dcmtk_have_alignof" = yes; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_GNU_ALIGNOF 1" >>confdefs.h
+
+    else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+
+
+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __attribute__((aligned))" >&5
+$as_echo_n "checking for __attribute__((aligned))... " >&6; }
+    cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+
+            int main(){__attribute__((aligned(4))) char c16;return 0;}
+
+
+_ACEOF
+if ac_fn_cxx_try_link "$LINENO"; then :
+  dcmtk_have_attribute_aligned=yes
+else
+  dcmtk_have_attribute_aligned=no
+
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+    if test "$dcmtk_have_attribute_aligned" = yes; then
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+$as_echo "#define HAVE_ATTRIBUTE_ALIGNED 1" >>confdefs.h
+
+    else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+    fi
+
+
 CFLAGS="$DEBUGCFLAGS $CFLAGS"
 CXXFLAGS="$DEBUGCXXFLAGS $CXXFLAGS"
 
--- a/ofstd/tests/toption.cc
+++ b/ofstd/tests/toption.cc
@@ -38,6 +38,11 @@
 
     OFoptional<int> o0( 3 ), o1, o2( OFnullopt );
 
+    COUT << OFalignof(OFoptional<char>) << ' ' << sizeof(OFoptional<char>) << OFendl;
+    COUT << OFalignof(OFoptional<short>) << ' ' << sizeof(OFoptional<short>) << OFendl;
+    COUT << OFalignof(OFoptional<float>) << ' ' << sizeof(OFoptional<float>) << OFendl;
+    COUT << OFalignof(long) << ' ' << sizeof(long) << ' ' << OFalignof(OFoptional<long>) << ' ' << sizeof(OFoptional<long>) << OFendl;
+
     OFCHECK( o0 && *o0 == 3 );
 
     OFCHECK( !o1 && !o2 );
