13 changed files with 120 additions and 1034 deletions
@ -1,26 +1 @@ |
|||||||
# |
build/ |
||||||
# Autotools |
|
||||||
# |
|
||||||
/Makefile |
|
||||||
/Makefile.in |
|
||||||
/aclocal.m4 |
|
||||||
/autom4te.cache |
|
||||||
/build-aux |
|
||||||
/config.* |
|
||||||
/configure |
|
||||||
/stamp-* |
|
||||||
.deps/ |
|
||||||
.dirstamp |
|
||||||
*.log |
|
||||||
*.trs |
|
||||||
|
|
||||||
# |
|
||||||
# Binaries |
|
||||||
# |
|
||||||
/src/rastertobrlaser |
|
||||||
/src/brdecode |
|
||||||
/test/test_lest |
|
||||||
/test/test_line |
|
||||||
/test/test_block |
|
||||||
/brlaser.drv |
|
||||||
*.o |
|
||||||
|
|||||||
@ -0,0 +1,115 @@ |
|||||||
|
cmake_minimum_required(VERSION 3.1) |
||||||
|
project(brlaser CXX) |
||||||
|
set(BRLASER_VERSION "4") |
||||||
|
|
||||||
|
if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) |
||||||
|
message(STATUS "No build type selected, default to RelWithDebInfo") |
||||||
|
set(CMAKE_BUILD_TYPE "RelWithDebInfo" CACHE STRING "Build type (default RelWithDebInfo)" FORCE) |
||||||
|
endif() |
||||||
|
|
||||||
|
include(CMakePushCheckState) |
||||||
|
include(CheckCXXCompilerFlag) |
||||||
|
include(CheckIncludeFileCXX) |
||||||
|
|
||||||
|
|
||||||
|
## Configure the compiler |
||||||
|
|
||||||
|
set(CMAKE_CXX_STANDARD 11) |
||||||
|
set(CMAKE_CXX_STANDARD_REQUIRED ON) |
||||||
|
|
||||||
|
macro(extra_cxx_compiler_flag FLAG) |
||||||
|
string(REGEX REPLACE "[^A-Za-z_0-9]" "_" SFLAG ${FLAG}) |
||||||
|
check_cxx_compiler_flag(${FLAG} COMPILER_SUPPORT_${SFLAG}) |
||||||
|
if(COMPILER_SUPPORT_${SFLAG}) |
||||||
|
set(EXTRA_CXX_FLAGS "${EXTRA_CXX_FLAGS} ${FLAG}") |
||||||
|
endif() |
||||||
|
endmacro(extra_cxx_compiler_flag) |
||||||
|
|
||||||
|
# Compiler warnings |
||||||
|
extra_cxx_compiler_flag("-Wall") |
||||||
|
extra_cxx_compiler_flag("-Wno-missing-braces") |
||||||
|
# Some security flags |
||||||
|
extra_cxx_compiler_flag("-fstack-protector-strong") |
||||||
|
extra_cxx_compiler_flag("-Wformat") |
||||||
|
extra_cxx_compiler_flag("-Werror=format-security") |
||||||
|
extra_cxx_compiler_flag("-D_FORTIFY_SOURCE=2") |
||||||
|
# Enable the supported flags, but give priority to CXXFLAGS env var |
||||||
|
set(CMAKE_CXX_FLAGS "${EXTRA_CXX_FLAGS} ${CMAKE_CXX_FLAGS}") |
||||||
|
|
||||||
|
|
||||||
|
## Configure CUPS |
||||||
|
|
||||||
|
find_program(CUPS_CONFIG NAMES cups-config) |
||||||
|
if(NOT CUPS_CONFIG) |
||||||
|
message(FATAL_ERROR "cups-config command not found. Are the CUPS development packages installed?") |
||||||
|
endif() |
||||||
|
execute_process( |
||||||
|
COMMAND "${CUPS_CONFIG}" --datadir |
||||||
|
OUTPUT_VARIABLE CUPS_DATA_DIR |
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
||||||
|
execute_process( |
||||||
|
COMMAND "${CUPS_CONFIG}" --serverbin |
||||||
|
OUTPUT_VARIABLE CUPS_SERVER_BIN |
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
||||||
|
execute_process( |
||||||
|
COMMAND "${CUPS_CONFIG}" --cflags |
||||||
|
OUTPUT_VARIABLE CUPS_CFLAGS |
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
||||||
|
execute_process( |
||||||
|
COMMAND "${CUPS_CONFIG}" --ldflags |
||||||
|
OUTPUT_VARIABLE CUPS_LDFLAGS |
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
||||||
|
execute_process( |
||||||
|
COMMAND "${CUPS_CONFIG}" --image --libs |
||||||
|
OUTPUT_VARIABLE CUPS_LIBS |
||||||
|
OUTPUT_STRIP_TRAILING_WHITESPACE) |
||||||
|
|
||||||
|
cmake_push_check_state() |
||||||
|
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} ${CUPS_CFLAGS}") |
||||||
|
check_include_file_cxx(cups/raster.h HAVE_CUPS_RASTER_H) |
||||||
|
cmake_pop_check_state() |
||||||
|
if(NOT HAVE_CUPS_RASTER_H) |
||||||
|
message(SEND_ERROR "<cups/raster.h> header not found. Are the CUPS development packages installed?") |
||||||
|
endif() |
||||||
|
|
||||||
|
|
||||||
|
## Build instructions |
||||||
|
|
||||||
|
configure_file( |
||||||
|
"${PROJECT_SOURCE_DIR}/brlaser.drv.in" |
||||||
|
"${PROJECT_BINARY_DIR}/brlaser.drv") |
||||||
|
|
||||||
|
configure_file( |
||||||
|
"${PROJECT_SOURCE_DIR}/config.h.in" |
||||||
|
"${PROJECT_BINARY_DIR}/config.h") |
||||||
|
|
||||||
|
include_directories("${PROJECT_BINARY_DIR}") |
||||||
|
|
||||||
|
add_executable(rastertobrlaser src/main.cc src/job.cc src/line.cc src/debug.cc) |
||||||
|
target_compile_options(rastertobrlaser PRIVATE ${CUPS_CFLAGS}) |
||||||
|
target_link_libraries(rastertobrlaser ${CUPS_LIBS}) |
||||||
|
target_link_libraries(rastertobrlaser ${CUPS_LDFLAGS}) |
||||||
|
|
||||||
|
add_executable(brdecode src/brdecode.cc) |
||||||
|
add_executable(test_lest test/test_lest.cc) |
||||||
|
add_executable(test_line test/test_line.cc src/line.cc) |
||||||
|
add_executable(test_block test/test_block.cc) |
||||||
|
|
||||||
|
enable_testing() |
||||||
|
add_test(test_lest test_lest) |
||||||
|
add_test(test_line test_line) |
||||||
|
add_test(test_block test_block) |
||||||
|
|
||||||
|
# Autotools-style "make check" command |
||||||
|
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND}) |
||||||
|
add_dependencies(check test_lest test_line test_block) |
||||||
|
|
||||||
|
|
||||||
|
# Installation |
||||||
|
|
||||||
|
install( |
||||||
|
TARGETS rastertobrlaser |
||||||
|
DESTINATION "${CUPS_SERVER_BIN}/filter") |
||||||
|
install( |
||||||
|
FILES "${PROJECT_BINARY_DIR}/brlaser.drv" |
||||||
|
DESTINATION "${CUPS_DATA_DIR}/drv") |
||||||
@ -1,51 +0,0 @@ |
|||||||
ACLOCAL_AMFLAGS = -I m4
|
|
||||||
AM_CXXFLAGS = $(CUPS_CFLAGS)
|
|
||||||
TESTS = $(check_PROGRAMS)
|
|
||||||
|
|
||||||
|
|
||||||
dist_doc_DATA = README.md
|
|
||||||
|
|
||||||
drv_DATA = brlaser.drv
|
|
||||||
drvdir = $(CUPS_DATADIR)/drv
|
|
||||||
|
|
||||||
filter_PROGRAMS = src/rastertobrlaser
|
|
||||||
filterdir = $(CUPS_SERVERBIN)/filter
|
|
||||||
|
|
||||||
noinst_PROGRAMS = src/brdecode
|
|
||||||
|
|
||||||
check_PROGRAMS = \
|
|
||||||
test/test_lest \
|
|
||||||
test/test_line \
|
|
||||||
test/test_block
|
|
||||||
|
|
||||||
|
|
||||||
src_rastertobrlaser_SOURCES = \
|
|
||||||
src/main.cc \
|
|
||||||
src/debug.h \
|
|
||||||
src/debug.cc \
|
|
||||||
src/job.h \
|
|
||||||
src/job.cc \
|
|
||||||
src/block.h \
|
|
||||||
src/line.h \
|
|
||||||
src/line.cc
|
|
||||||
src_rastertobrlaser_LDADD = $(CUPS_LIBS)
|
|
||||||
src_rastertobrlaser_LDFLAGS = $(CUPS_LDFLAGS)
|
|
||||||
|
|
||||||
src_brdecode_SOURCES = \
|
|
||||||
src/brdecode.cc
|
|
||||||
|
|
||||||
test_test_lest_SOURCES = \
|
|
||||||
test/test_lest.cc \
|
|
||||||
test/lest.hpp
|
|
||||||
|
|
||||||
test_test_line_SOURCES = \
|
|
||||||
test/test_line.cc \
|
|
||||||
src/line.h \
|
|
||||||
src/line.cc \
|
|
||||||
test/lest.hpp
|
|
||||||
|
|
||||||
test_test_block_SOURCES = \
|
|
||||||
test/test_block.cc \
|
|
||||||
src/block.h \
|
|
||||||
test/tempfile.h \
|
|
||||||
test/lest.hpp
|
|
||||||
@ -1,15 +0,0 @@ |
|||||||
#! /bin/sh |
|
||||||
|
|
||||||
srcdir=`dirname "$0"` |
|
||||||
test -z "$srcdir" && srcdir=. |
|
||||||
|
|
||||||
ORIGDIR=`pwd` |
|
||||||
cd "$srcdir" |
|
||||||
|
|
||||||
autoreconf --force -v --install || exit 1 |
|
||||||
cd "$ORIGDIR" || exit $? |
|
||||||
|
|
||||||
if test -z "$NOCONFIGURE"; then |
|
||||||
exec "$srcdir"/configure "$@" |
|
||||||
fi |
|
||||||
|
|
||||||
@ -0,0 +1,2 @@ |
|||||||
|
#define PACKAGE "@CMAKE_PROJECT_NAME@" |
||||||
|
#define VERSION "@BRLASER_VERSION@" |
||||||
@ -1,59 +0,0 @@ |
|||||||
# This file is part of the brlaser printer driver. |
|
||||||
# |
|
||||||
# Copyright 2013 Peter De Wachter |
|
||||||
# |
|
||||||
# brlaser is free software: you can redistribute it and/or modify |
|
||||||
# it under the terms of the GNU General Public License as published by |
|
||||||
# the Free Software Foundation, either version 2 of the License, or |
|
||||||
# (at your option) any later version. |
|
||||||
# |
|
||||||
# brlaser is distributed in the hope that it will be useful, |
|
||||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
||||||
# GNU General Public License for more details. |
|
||||||
# |
|
||||||
# You should have received a copy of the GNU General Public License |
|
||||||
# along with brlaser. If not, see <http:#www.gnu.org/licenses/>. |
|
||||||
|
|
||||||
AC_PREREQ(2.68) |
|
||||||
AC_INIT([brlaser], [3], [pdewacht@gmail.com], [brlaser], |
|
||||||
[https://github.com/pdewacht/brlaser]) |
|
||||||
|
|
||||||
AC_CONFIG_SRCDIR([src/line.cc]) |
|
||||||
AC_CONFIG_MACRO_DIR([m4]) |
|
||||||
AC_CONFIG_AUX_DIR([build-aux]) |
|
||||||
AC_LANG([C++]) |
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE([1.11.1 foreign subdir-objects dist-xz -Wall -Werror]) |
|
||||||
AM_MAINTAINER_MODE([enable]) |
|
||||||
AM_SILENT_RULES([yes]) |
|
||||||
|
|
||||||
AC_PROG_CXX |
|
||||||
AX_CXX_COMPILE_STDCXX([11]) |
|
||||||
AX_CXXFLAGS_WARN_ALL |
|
||||||
|
|
||||||
dnl Use cups-config to detect the CUPS configuration. |
|
||||||
AC_PATH_PROG(CUPS_CONFIG, cups-config) |
|
||||||
AS_IF([test -z "$CUPS_CONFIG"], |
|
||||||
[AC_MSG_ERROR(["cups-config" command not found. Please install the CUPS development package.])]) |
|
||||||
CUPS_CFLAGS=`"$CUPS_CONFIG" --cflags` |
|
||||||
CUPS_LIBS=`"$CUPS_CONFIG" --image --libs` |
|
||||||
CUPS_LDFLAGS=`"$CUPS_CONFIG" --image --ldflags` |
|
||||||
CUPS_SERVERBIN=`"$CUPS_CONFIG" --serverbin` |
|
||||||
CUPS_DATADIR=`"$CUPS_CONFIG" --datadir` |
|
||||||
AC_SUBST(CUPS_CFLAGS) |
|
||||||
AC_SUBST(CUPS_LIBS) |
|
||||||
AC_SUBST(CUPS_LDFLAGS) |
|
||||||
AC_SUBST(CUPS_SERVERBIN) |
|
||||||
AC_SUBST(CUPS_DATADIR) |
|
||||||
|
|
||||||
dnl 'cups-config --libs' lists a lot of libs we don't need/want, |
|
||||||
dnl try to figure out whether the linker knows about --as-needed. |
|
||||||
AC_ARG_ENABLE([as-needed], |
|
||||||
AC_HELP_STRING([--disable-as-needed], [disable overlinking protection])) |
|
||||||
AS_IF([test "x$enable_as_needed" != "xno"], |
|
||||||
[AX_APPEND_LINK_FLAGS([-Wl,--as-needed])]) |
|
||||||
|
|
||||||
AC_CONFIG_HEADERS([config.h]) |
|
||||||
AC_CONFIG_FILES([Makefile brlaser.drv]) |
|
||||||
AC_OUTPUT |
|
||||||
@ -1,69 +0,0 @@ |
|||||||
# =========================================================================== |
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_append_flag.html |
|
||||||
# =========================================================================== |
|
||||||
# |
|
||||||
# SYNOPSIS |
|
||||||
# |
|
||||||
# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) |
|
||||||
# |
|
||||||
# DESCRIPTION |
|
||||||
# |
|
||||||
# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space |
|
||||||
# added in between. |
|
||||||
# |
|
||||||
# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. |
|
||||||
# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains |
|
||||||
# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly |
|
||||||
# FLAG. |
|
||||||
# |
|
||||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. |
|
||||||
# |
|
||||||
# LICENSE |
|
||||||
# |
|
||||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> |
|
||||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> |
|
||||||
# |
|
||||||
# This program is free software: you can redistribute it and/or modify it |
|
||||||
# under the terms of the GNU General Public License as published by the |
|
||||||
# Free Software Foundation, either version 3 of the License, or (at your |
|
||||||
# option) any later version. |
|
||||||
# |
|
||||||
# This program is distributed in the hope that it will be useful, but |
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
|
||||||
# Public License for more details. |
|
||||||
# |
|
||||||
# You should have received a copy of the GNU General Public License along |
|
||||||
# with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||||
# |
|
||||||
# As a special exception, the respective Autoconf Macro's copyright owner |
|
||||||
# gives unlimited permission to copy, distribute and modify the configure |
|
||||||
# scripts that are the output of Autoconf when processing the Macro. You |
|
||||||
# need not follow the terms of the GNU General Public License when using |
|
||||||
# or distributing such scripts, even though portions of the text of the |
|
||||||
# Macro appear in them. The GNU General Public License (GPL) does govern |
|
||||||
# all other use of the material that constitutes the Autoconf Macro. |
|
||||||
# |
|
||||||
# This special exception to the GPL applies to versions of the Autoconf |
|
||||||
# Macro released by the Autoconf Archive. When you make and distribute a |
|
||||||
# modified version of the Autoconf Macro, you may extend this special |
|
||||||
# exception to the GPL to apply to your modified version as well. |
|
||||||
|
|
||||||
#serial 2 |
|
||||||
|
|
||||||
AC_DEFUN([AX_APPEND_FLAG], |
|
||||||
[AC_PREREQ(2.59)dnl for _AC_LANG_PREFIX |
|
||||||
AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])])dnl |
|
||||||
AS_VAR_SET_IF(FLAGS, |
|
||||||
[case " AS_VAR_GET(FLAGS) " in |
|
||||||
*" $1 "*) |
|
||||||
AC_RUN_LOG([: FLAGS already contains $1]) |
|
||||||
;; |
|
||||||
*) |
|
||||||
AC_RUN_LOG([: FLAGS="$FLAGS $1"]) |
|
||||||
AS_VAR_SET(FLAGS, ["AS_VAR_GET(FLAGS) $1"]) |
|
||||||
;; |
|
||||||
esac], |
|
||||||
[AS_VAR_SET(FLAGS,["$1"])]) |
|
||||||
AS_VAR_POPDEF([FLAGS])dnl |
|
||||||
])dnl AX_APPEND_FLAG |
|
||||||
@ -1,61 +0,0 @@ |
|||||||
# =========================================================================== |
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_append_link_flags.html |
|
||||||
# =========================================================================== |
|
||||||
# |
|
||||||
# SYNOPSIS |
|
||||||
# |
|
||||||
# AX_APPEND_LINK_FLAGS([FLAG1 FLAG2 ...], [FLAGS-VARIABLE], [EXTRA-FLAGS]) |
|
||||||
# |
|
||||||
# DESCRIPTION |
|
||||||
# |
|
||||||
# For every FLAG1, FLAG2 it is checked whether the linker works with the |
|
||||||
# flag. If it does, the flag is added FLAGS-VARIABLE |
|
||||||
# |
|
||||||
# If FLAGS-VARIABLE is not specified, the linker's flags (LDFLAGS) is |
|
||||||
# used. During the check the flag is always added to the linker's flags. |
|
||||||
# |
|
||||||
# If EXTRA-FLAGS is defined, it is added to the linker's default flags |
|
||||||
# when the check is done. The check is thus made with the flags: "LDFLAGS |
|
||||||
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to |
|
||||||
# issue an error when a bad flag is given. |
|
||||||
# |
|
||||||
# NOTE: This macro depends on the AX_APPEND_FLAG and AX_CHECK_LINK_FLAG. |
|
||||||
# Please keep this macro in sync with AX_APPEND_COMPILE_FLAGS. |
|
||||||
# |
|
||||||
# LICENSE |
|
||||||
# |
|
||||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> |
|
||||||
# |
|
||||||
# This program is free software: you can redistribute it and/or modify it |
|
||||||
# under the terms of the GNU General Public License as published by the |
|
||||||
# Free Software Foundation, either version 3 of the License, or (at your |
|
||||||
# option) any later version. |
|
||||||
# |
|
||||||
# This program is distributed in the hope that it will be useful, but |
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
|
||||||
# Public License for more details. |
|
||||||
# |
|
||||||
# You should have received a copy of the GNU General Public License along |
|
||||||
# with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||||
# |
|
||||||
# As a special exception, the respective Autoconf Macro's copyright owner |
|
||||||
# gives unlimited permission to copy, distribute and modify the configure |
|
||||||
# scripts that are the output of Autoconf when processing the Macro. You |
|
||||||
# need not follow the terms of the GNU General Public License when using |
|
||||||
# or distributing such scripts, even though portions of the text of the |
|
||||||
# Macro appear in them. The GNU General Public License (GPL) does govern |
|
||||||
# all other use of the material that constitutes the Autoconf Macro. |
|
||||||
# |
|
||||||
# This special exception to the GPL applies to versions of the Autoconf |
|
||||||
# Macro released by the Autoconf Archive. When you make and distribute a |
|
||||||
# modified version of the Autoconf Macro, you may extend this special |
|
||||||
# exception to the GPL to apply to your modified version as well. |
|
||||||
|
|
||||||
#serial 2 |
|
||||||
|
|
||||||
AC_DEFUN([AX_APPEND_LINK_FLAGS], |
|
||||||
[for flag in $1; do |
|
||||||
AX_CHECK_LINK_FLAG([$flag], [AX_APPEND_FLAG([$flag], [m4_default([$2], [LDFLAGS])])], [], [$3]) |
|
||||||
done |
|
||||||
])dnl AX_APPEND_LINK_FLAGS |
|
||||||
@ -1,122 +0,0 @@ |
|||||||
# =========================================================================== |
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_cflags_warn_all.html |
|
||||||
# =========================================================================== |
|
||||||
# |
|
||||||
# SYNOPSIS |
|
||||||
# |
|
||||||
# AX_CFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] |
|
||||||
# AX_CXXFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] |
|
||||||
# AX_FCFLAGS_WARN_ALL [(shellvar [,default, [A/NA]])] |
|
||||||
# |
|
||||||
# DESCRIPTION |
|
||||||
# |
|
||||||
# Try to find a compiler option that enables most reasonable warnings. |
|
||||||
# |
|
||||||
# For the GNU compiler it will be -Wall (and -ansi -pedantic) The result |
|
||||||
# is added to the shellvar being CFLAGS, CXXFLAGS, or FCFLAGS by default. |
|
||||||
# |
|
||||||
# Currently this macro knows about the GCC, Solaris, Digital Unix, AIX, |
|
||||||
# HP-UX, IRIX, NEC SX-5 (Super-UX 10), Cray J90 (Unicos 10.0.0.8), and |
|
||||||
# Intel compilers. For a given compiler, the Fortran flags are much more |
|
||||||
# experimental than their C equivalents. |
|
||||||
# |
|
||||||
# - $1 shell-variable-to-add-to : CFLAGS, CXXFLAGS, or FCFLAGS |
|
||||||
# - $2 add-value-if-not-found : nothing |
|
||||||
# - $3 action-if-found : add value to shellvariable |
|
||||||
# - $4 action-if-not-found : nothing |
|
||||||
# |
|
||||||
# NOTE: These macros depend on AX_APPEND_FLAG. |
|
||||||
# |
|
||||||
# LICENSE |
|
||||||
# |
|
||||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> |
|
||||||
# Copyright (c) 2010 Rhys Ulerich <rhys.ulerich@gmail.com> |
|
||||||
# |
|
||||||
# This program is free software; you can redistribute it and/or modify it |
|
||||||
# under the terms of the GNU General Public License as published by the |
|
||||||
# Free Software Foundation; either version 3 of the License, or (at your |
|
||||||
# option) any later version. |
|
||||||
# |
|
||||||
# This program is distributed in the hope that it will be useful, but |
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
|
||||||
# Public License for more details. |
|
||||||
# |
|
||||||
# You should have received a copy of the GNU General Public License along |
|
||||||
# with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||||
# |
|
||||||
# As a special exception, the respective Autoconf Macro's copyright owner |
|
||||||
# gives unlimited permission to copy, distribute and modify the configure |
|
||||||
# scripts that are the output of Autoconf when processing the Macro. You |
|
||||||
# need not follow the terms of the GNU General Public License when using |
|
||||||
# or distributing such scripts, even though portions of the text of the |
|
||||||
# Macro appear in them. The GNU General Public License (GPL) does govern |
|
||||||
# all other use of the material that constitutes the Autoconf Macro. |
|
||||||
# |
|
||||||
# This special exception to the GPL applies to versions of the Autoconf |
|
||||||
# Macro released by the Autoconf Archive. When you make and distribute a |
|
||||||
# modified version of the Autoconf Macro, you may extend this special |
|
||||||
# exception to the GPL to apply to your modified version as well. |
|
||||||
|
|
||||||
#serial 14 |
|
||||||
|
|
||||||
AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl |
|
||||||
AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl |
|
||||||
AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl |
|
||||||
AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], |
|
||||||
VAR,[VAR="no, unknown" |
|
||||||
ac_save_[]FLAGS="$[]FLAGS" |
|
||||||
for ac_arg dnl |
|
||||||
in "-warn all % -warn all" dnl Intel |
|
||||||
"-pedantic % -Wall" dnl GCC |
|
||||||
"-xstrconst % -v" dnl Solaris C |
|
||||||
"-std1 % -verbose -w0 -warnprotos" dnl Digital Unix |
|
||||||
"-qlanglvl=ansi % -qsrcmsg -qinfo=all:noppt:noppc:noobs:nocnd" dnl AIX |
|
||||||
"-ansi -ansiE % -fullwarn" dnl IRIX |
|
||||||
"+ESlit % +w1" dnl HP-UX C |
|
||||||
"-Xc % -pvctl[,]fullmsg" dnl NEC SX-5 (Super-UX 10) |
|
||||||
"-h conform % -h msglevel 2" dnl Cray C (Unicos) |
|
||||||
# |
|
||||||
do FLAGS="$ac_save_[]FLAGS "`echo $ac_arg | sed -e 's,%%.*,,' -e 's,%,,'` |
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM], |
|
||||||
[VAR=`echo $ac_arg | sed -e 's,.*% *,,'` ; break]) |
|
||||||
done |
|
||||||
FLAGS="$ac_save_[]FLAGS" |
|
||||||
]) |
|
||||||
AS_VAR_POPDEF([FLAGS])dnl |
|
||||||
AC_REQUIRE([AX_APPEND_FLAG]) |
|
||||||
case ".$VAR" in |
|
||||||
.ok|.ok,*) m4_ifvaln($3,$3) ;; |
|
||||||
.|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; |
|
||||||
*) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; |
|
||||||
esac |
|
||||||
AS_VAR_POPDEF([VAR])dnl |
|
||||||
])dnl AX_FLAGS_WARN_ALL |
|
||||||
dnl implementation tactics: |
|
||||||
dnl the for-argument contains a list of options. The first part of |
|
||||||
dnl these does only exist to detect the compiler - usually it is |
|
||||||
dnl a global option to enable -ansi or -extrawarnings. All other |
|
||||||
dnl compilers will fail about it. That was needed since a lot of |
|
||||||
dnl compilers will give false positives for some option-syntax |
|
||||||
dnl like -Woption or -Xoption as they think of it is a pass-through |
|
||||||
dnl to later compile stages or something. The "%" is used as a |
|
||||||
dnl delimiter. A non-option comment can be given after "%%" marks |
|
||||||
dnl which will be shown but not added to the respective C/CXXFLAGS. |
|
||||||
|
|
||||||
AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl |
|
||||||
AC_LANG_PUSH([C]) |
|
||||||
AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) |
|
||||||
AC_LANG_POP([C]) |
|
||||||
]) |
|
||||||
|
|
||||||
AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl |
|
||||||
AC_LANG_PUSH([C++]) |
|
||||||
AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) |
|
||||||
AC_LANG_POP([C++]) |
|
||||||
]) |
|
||||||
|
|
||||||
AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl |
|
||||||
AC_LANG_PUSH([Fortran]) |
|
||||||
AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) |
|
||||||
AC_LANG_POP([Fortran]) |
|
||||||
]) |
|
||||||
@ -1,73 +0,0 @@ |
|||||||
# =========================================================================== |
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html |
|
||||||
# =========================================================================== |
|
||||||
# |
|
||||||
# SYNOPSIS |
|
||||||
# |
|
||||||
# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) |
|
||||||
# |
|
||||||
# DESCRIPTION |
|
||||||
# |
|
||||||
# Check whether the given FLAG works with the linker or gives an error. |
|
||||||
# (Warnings, however, are ignored) |
|
||||||
# |
|
||||||
# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on |
|
||||||
# success/failure. |
|
||||||
# |
|
||||||
# If EXTRA-FLAGS is defined, it is added to the linker's default flags |
|
||||||
# when the check is done. The check is thus made with the flags: "LDFLAGS |
|
||||||
# EXTRA-FLAGS FLAG". This can for example be used to force the linker to |
|
||||||
# issue an error when a bad flag is given. |
|
||||||
# |
|
||||||
# INPUT gives an alternative input source to AC_LINK_IFELSE. |
|
||||||
# |
|
||||||
# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this |
|
||||||
# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. |
|
||||||
# |
|
||||||
# LICENSE |
|
||||||
# |
|
||||||
# Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de> |
|
||||||
# Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com> |
|
||||||
# |
|
||||||
# This program is free software: you can redistribute it and/or modify it |
|
||||||
# under the terms of the GNU General Public License as published by the |
|
||||||
# Free Software Foundation, either version 3 of the License, or (at your |
|
||||||
# option) any later version. |
|
||||||
# |
|
||||||
# This program is distributed in the hope that it will be useful, but |
|
||||||
# WITHOUT ANY WARRANTY; without even the implied warranty of |
|
||||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General |
|
||||||
# Public License for more details. |
|
||||||
# |
|
||||||
# You should have received a copy of the GNU General Public License along |
|
||||||
# with this program. If not, see <http://www.gnu.org/licenses/>. |
|
||||||
# |
|
||||||
# As a special exception, the respective Autoconf Macro's copyright owner |
|
||||||
# gives unlimited permission to copy, distribute and modify the configure |
|
||||||
# scripts that are the output of Autoconf when processing the Macro. You |
|
||||||
# need not follow the terms of the GNU General Public License when using |
|
||||||
# or distributing such scripts, even though portions of the text of the |
|
||||||
# Macro appear in them. The GNU General Public License (GPL) does govern |
|
||||||
# all other use of the material that constitutes the Autoconf Macro. |
|
||||||
# |
|
||||||
# This special exception to the GPL applies to versions of the Autoconf |
|
||||||
# Macro released by the Autoconf Archive. When you make and distribute a |
|
||||||
# modified version of the Autoconf Macro, you may extend this special |
|
||||||
# exception to the GPL to apply to your modified version as well. |
|
||||||
|
|
||||||
#serial 3 |
|
||||||
|
|
||||||
AC_DEFUN([AX_CHECK_LINK_FLAG], |
|
||||||
[AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl |
|
||||||
AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ |
|
||||||
ax_check_save_flags=$LDFLAGS |
|
||||||
LDFLAGS="$LDFLAGS $4 $1" |
|
||||||
AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], |
|
||||||
[AS_VAR_SET(CACHEVAR,[yes])], |
|
||||||
[AS_VAR_SET(CACHEVAR,[no])]) |
|
||||||
LDFLAGS=$ax_check_save_flags]) |
|
||||||
AS_IF([test x"AS_VAR_GET(CACHEVAR)" = xyes], |
|
||||||
[m4_default([$2], :)], |
|
||||||
[m4_default([$3], :)]) |
|
||||||
AS_VAR_POPDEF([CACHEVAR])dnl |
|
||||||
])dnl AX_CHECK_LINK_FLAGS |
|
||||||
@ -1,556 +0,0 @@ |
|||||||
# =========================================================================== |
|
||||||
# http://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html |
|
||||||
# =========================================================================== |
|
||||||
# |
|
||||||
# SYNOPSIS |
|
||||||
# |
|
||||||
# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) |
|
||||||
# |
|
||||||
# DESCRIPTION |
|
||||||
# |
|
||||||
# Check for baseline language coverage in the compiler for the specified |
|
||||||
# version of the C++ standard. If necessary, add switches to CXX to |
|
||||||
# enable support. VERSION may be '11' (for the C++11 standard) or '14' |
|
||||||
# (for the C++14 standard). |
|
||||||
# |
|
||||||
# The second argument, if specified, indicates whether you insist on an |
|
||||||
# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. |
|
||||||
# -std=c++11). If neither is specified, you get whatever works, with |
|
||||||
# preference for an extended mode. |
|
||||||
# |
|
||||||
# The third argument, if specified 'mandatory' or if left unspecified, |
|
||||||
# indicates that baseline support for the specified C++ standard is |
|
||||||
# required and that the macro should error out if no mode with that |
|
||||||
# support is found. If specified 'optional', then configuration proceeds |
|
||||||
# regardless, after defining HAVE_CXX${VERSION} if and only if a |
|
||||||
# supporting mode is found. |
|
||||||
# |
|
||||||
# LICENSE |
|
||||||
# |
|
||||||
# Copyright (c) 2008 Benjamin Kosnik <bkoz@redhat.com> |
|
||||||
# Copyright (c) 2012 Zack Weinberg <zackw@panix.com> |
|
||||||
# Copyright (c) 2013 Roy Stogner <roystgnr@ices.utexas.edu> |
|
||||||
# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov <sokolov@google.com> |
|
||||||
# Copyright (c) 2015 Paul Norman <penorman@mac.com> |
|
||||||
# Copyright (c) 2015 Moritz Klammler <moritz@klammler.eu> |
|
||||||
# |
|
||||||
# Copying and distribution of this file, with or without modification, are |
|
||||||
# permitted in any medium without royalty provided the copyright notice |
|
||||||
# and this notice are preserved. This file is offered as-is, without any |
|
||||||
# warranty. |
|
||||||
|
|
||||||
#serial 3 |
|
||||||
|
|
||||||
dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro |
|
||||||
dnl (serial version number 13). |
|
||||||
|
|
||||||
AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl |
|
||||||
m4_if([$1], [11], [], |
|
||||||
[$1], [14], [], |
|
||||||
[$1], [17], [m4_fatal([support for C++17 not yet implemented in AX_CXX_COMPILE_STDCXX])], |
|
||||||
[m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl |
|
||||||
m4_if([$2], [], [], |
|
||||||
[$2], [ext], [], |
|
||||||
[$2], [noext], [], |
|
||||||
[m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl |
|
||||||
m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], |
|
||||||
[$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], |
|
||||||
[$3], [optional], [ax_cxx_compile_cxx$1_required=false], |
|
||||||
[m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) |
|
||||||
AC_LANG_PUSH([C++])dnl |
|
||||||
ac_success=no |
|
||||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features by default, |
|
||||||
ax_cv_cxx_compile_cxx$1, |
|
||||||
[AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], |
|
||||||
[ax_cv_cxx_compile_cxx$1=yes], |
|
||||||
[ax_cv_cxx_compile_cxx$1=no])]) |
|
||||||
if test x$ax_cv_cxx_compile_cxx$1 = xyes; then |
|
||||||
ac_success=yes |
|
||||||
fi |
|
||||||
|
|
||||||
m4_if([$2], [noext], [], [dnl |
|
||||||
if test x$ac_success = xno; then |
|
||||||
for switch in -std=gnu++$1 -std=gnu++0x; do |
|
||||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) |
|
||||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, |
|
||||||
$cachevar, |
|
||||||
[ac_save_CXX="$CXX" |
|
||||||
CXX="$CXX $switch" |
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], |
|
||||||
[eval $cachevar=yes], |
|
||||||
[eval $cachevar=no]) |
|
||||||
CXX="$ac_save_CXX"]) |
|
||||||
if eval test x\$$cachevar = xyes; then |
|
||||||
CXX="$CXX $switch" |
|
||||||
ac_success=yes |
|
||||||
break |
|
||||||
fi |
|
||||||
done |
|
||||||
fi]) |
|
||||||
|
|
||||||
m4_if([$2], [ext], [], [dnl |
|
||||||
if test x$ac_success = xno; then |
|
||||||
dnl HP's aCC needs +std=c++11 according to: |
|
||||||
dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf |
|
||||||
dnl Cray's crayCC needs "-h std=c++11" |
|
||||||
for switch in -std=c++$1 -std=c++0x +std=c++$1 "-h std=c++$1"; do |
|
||||||
cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) |
|
||||||
AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, |
|
||||||
$cachevar, |
|
||||||
[ac_save_CXX="$CXX" |
|
||||||
CXX="$CXX $switch" |
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], |
|
||||||
[eval $cachevar=yes], |
|
||||||
[eval $cachevar=no]) |
|
||||||
CXX="$ac_save_CXX"]) |
|
||||||
if eval test x\$$cachevar = xyes; then |
|
||||||
CXX="$CXX $switch" |
|
||||||
ac_success=yes |
|
||||||
break |
|
||||||
fi |
|
||||||
done |
|
||||||
fi]) |
|
||||||
AC_LANG_POP([C++]) |
|
||||||
if test x$ax_cxx_compile_cxx$1_required = xtrue; then |
|
||||||
if test x$ac_success = xno; then |
|
||||||
AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) |
|
||||||
fi |
|
||||||
fi |
|
||||||
if test x$ac_success = xno; then |
|
||||||
HAVE_CXX$1=0 |
|
||||||
AC_MSG_NOTICE([No compiler with C++$1 support was found]) |
|
||||||
else |
|
||||||
HAVE_CXX$1=1 |
|
||||||
AC_DEFINE(HAVE_CXX$1,1, |
|
||||||
[define if the compiler supports basic C++$1 syntax]) |
|
||||||
fi |
|
||||||
AC_SUBST(HAVE_CXX$1) |
|
||||||
]) |
|
||||||
|
|
||||||
|
|
||||||
dnl Test body for checking C++11 support |
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], |
|
||||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 |
|
||||||
) |
|
||||||
|
|
||||||
|
|
||||||
dnl Test body for checking C++14 support |
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], |
|
||||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_11 |
|
||||||
_AX_CXX_COMPILE_STDCXX_testbody_new_in_14 |
|
||||||
) |
|
||||||
|
|
||||||
|
|
||||||
dnl Tests for new features in C++11 |
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ |
|
||||||
|
|
||||||
// If the compiler admits that it is not ready for C++11, why torture it? |
|
||||||
// Hopefully, this will speed up the test. |
|
||||||
|
|
||||||
#ifndef __cplusplus |
|
||||||
|
|
||||||
#error "This is not a C++ compiler" |
|
||||||
|
|
||||||
#elif __cplusplus < 201103L |
|
||||||
|
|
||||||
#error "This is not a C++11 compiler" |
|
||||||
|
|
||||||
#else |
|
||||||
|
|
||||||
namespace cxx11 |
|
||||||
{ |
|
||||||
|
|
||||||
namespace test_static_assert |
|
||||||
{ |
|
||||||
|
|
||||||
template <typename T> |
|
||||||
struct check |
|
||||||
{ |
|
||||||
static_assert(sizeof(int) <= sizeof(T), "not big enough"); |
|
||||||
}; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_final_override |
|
||||||
{ |
|
||||||
|
|
||||||
struct Base |
|
||||||
{ |
|
||||||
virtual void f() {} |
|
||||||
}; |
|
||||||
|
|
||||||
struct Derived : public Base |
|
||||||
{ |
|
||||||
virtual void f() override {} |
|
||||||
}; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_double_right_angle_brackets |
|
||||||
{ |
|
||||||
|
|
||||||
template < typename T > |
|
||||||
struct check {}; |
|
||||||
|
|
||||||
typedef check<void> single_type; |
|
||||||
typedef check<check<void>> double_type; |
|
||||||
typedef check<check<check<void>>> triple_type; |
|
||||||
typedef check<check<check<check<void>>>> quadruple_type; |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_decltype |
|
||||||
{ |
|
||||||
|
|
||||||
int |
|
||||||
f() |
|
||||||
{ |
|
||||||
int a = 1; |
|
||||||
decltype(a) b = 2; |
|
||||||
return a + b; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_type_deduction |
|
||||||
{ |
|
||||||
|
|
||||||
template < typename T1, typename T2 > |
|
||||||
struct is_same |
|
||||||
{ |
|
||||||
static const bool value = false; |
|
||||||
}; |
|
||||||
|
|
||||||
template < typename T > |
|
||||||
struct is_same<T, T> |
|
||||||
{ |
|
||||||
static const bool value = true; |
|
||||||
}; |
|
||||||
|
|
||||||
template < typename T1, typename T2 > |
|
||||||
auto |
|
||||||
add(T1 a1, T2 a2) -> decltype(a1 + a2) |
|
||||||
{ |
|
||||||
return a1 + a2; |
|
||||||
} |
|
||||||
|
|
||||||
int |
|
||||||
test(const int c, volatile int v) |
|
||||||
{ |
|
||||||
static_assert(is_same<int, decltype(0)>::value == true, ""); |
|
||||||
static_assert(is_same<int, decltype(c)>::value == false, ""); |
|
||||||
static_assert(is_same<int, decltype(v)>::value == false, ""); |
|
||||||
auto ac = c; |
|
||||||
auto av = v; |
|
||||||
auto sumi = ac + av + 'x'; |
|
||||||
auto sumf = ac + av + 1.0; |
|
||||||
static_assert(is_same<int, decltype(ac)>::value == true, ""); |
|
||||||
static_assert(is_same<int, decltype(av)>::value == true, ""); |
|
||||||
static_assert(is_same<int, decltype(sumi)>::value == true, ""); |
|
||||||
static_assert(is_same<int, decltype(sumf)>::value == false, ""); |
|
||||||
static_assert(is_same<int, decltype(add(c, v))>::value == true, ""); |
|
||||||
return (sumf > 0.0) ? sumi : add(c, v); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_noexcept |
|
||||||
{ |
|
||||||
|
|
||||||
int f() { return 0; } |
|
||||||
int g() noexcept { return 0; } |
|
||||||
|
|
||||||
static_assert(noexcept(f()) == false, ""); |
|
||||||
static_assert(noexcept(g()) == true, ""); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_constexpr |
|
||||||
{ |
|
||||||
|
|
||||||
template < typename CharT > |
|
||||||
unsigned long constexpr |
|
||||||
strlen_c_r(const CharT *const s, const unsigned long acc) noexcept |
|
||||||
{ |
|
||||||
return *s ? strlen_c_r(s + 1, acc + 1) : acc; |
|
||||||
} |
|
||||||
|
|
||||||
template < typename CharT > |
|
||||||
unsigned long constexpr |
|
||||||
strlen_c(const CharT *const s) noexcept |
|
||||||
{ |
|
||||||
return strlen_c_r(s, 0UL); |
|
||||||
} |
|
||||||
|
|
||||||
static_assert(strlen_c("") == 0UL, ""); |
|
||||||
static_assert(strlen_c("1") == 1UL, ""); |
|
||||||
static_assert(strlen_c("example") == 7UL, ""); |
|
||||||
static_assert(strlen_c("another\0example") == 7UL, ""); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_rvalue_references |
|
||||||
{ |
|
||||||
|
|
||||||
template < int N > |
|
||||||
struct answer |
|
||||||
{ |
|
||||||
static constexpr int value = N; |
|
||||||
}; |
|
||||||
|
|
||||||
answer<1> f(int&) { return answer<1>(); } |
|
||||||
answer<2> f(const int&) { return answer<2>(); } |
|
||||||
answer<3> f(int&&) { return answer<3>(); } |
|
||||||
|
|
||||||
void |
|
||||||
test() |
|
||||||
{ |
|
||||||
int i = 0; |
|
||||||
const int c = 0; |
|
||||||
static_assert(decltype(f(i))::value == 1, ""); |
|
||||||
static_assert(decltype(f(c))::value == 2, ""); |
|
||||||
static_assert(decltype(f(0))::value == 3, ""); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_uniform_initialization |
|
||||||
{ |
|
||||||
|
|
||||||
struct test |
|
||||||
{ |
|
||||||
static const int zero {}; |
|
||||||
static const int one {1}; |
|
||||||
}; |
|
||||||
|
|
||||||
static_assert(test::zero == 0, ""); |
|
||||||
static_assert(test::one == 1, ""); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_lambdas |
|
||||||
{ |
|
||||||
|
|
||||||
void |
|
||||||
test1() |
|
||||||
{ |
|
||||||
auto lambda1 = [](){}; |
|
||||||
auto lambda2 = lambda1; |
|
||||||
lambda1(); |
|
||||||
lambda2(); |
|
||||||
} |
|
||||||
|
|
||||||
int |
|
||||||
test2() |
|
||||||
{ |
|
||||||
auto a = [](int i, int j){ return i + j; }(1, 2); |
|
||||||
auto b = []() -> int { return '0'; }(); |
|
||||||
auto c = [=](){ return a + b; }(); |
|
||||||
auto d = [&](){ return c; }(); |
|
||||||
auto e = [a, &b](int x) mutable { |
|
||||||
const auto identity = [](int y){ return y; }; |
|
||||||
for (auto i = 0; i < a; ++i) |
|
||||||
a += b--; |
|
||||||
return x + identity(a + b); |
|
||||||
}(0); |
|
||||||
return a + b + c + d + e; |
|
||||||
} |
|
||||||
|
|
||||||
int |
|
||||||
test3() |
|
||||||
{ |
|
||||||
const auto nullary = [](){ return 0; }; |
|
||||||
const auto unary = [](int x){ return x; }; |
|
||||||
using nullary_t = decltype(nullary); |
|
||||||
using unary_t = decltype(unary); |
|
||||||
const auto higher1st = [](nullary_t f){ return f(); }; |
|
||||||
const auto higher2nd = [unary](nullary_t f1){ |
|
||||||
return [unary, f1](unary_t f2){ return f2(unary(f1())); }; |
|
||||||
}; |
|
||||||
return higher1st(nullary) + higher2nd(nullary)(unary); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_variadic_templates |
|
||||||
{ |
|
||||||
|
|
||||||
template <int...> |
|
||||||
struct sum; |
|
||||||
|
|
||||||
template <int N0, int... N1toN> |
|
||||||
struct sum<N0, N1toN...> |
|
||||||
{ |
|
||||||
static constexpr auto value = N0 + sum<N1toN...>::value; |
|
||||||
}; |
|
||||||
|
|
||||||
template <> |
|
||||||
struct sum<> |
|
||||||
{ |
|
||||||
static constexpr auto value = 0; |
|
||||||
}; |
|
||||||
|
|
||||||
static_assert(sum<>::value == 0, ""); |
|
||||||
static_assert(sum<1>::value == 1, ""); |
|
||||||
static_assert(sum<23>::value == 23, ""); |
|
||||||
static_assert(sum<1, 2>::value == 3, ""); |
|
||||||
static_assert(sum<5, 5, 11>::value == 21, ""); |
|
||||||
static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
// http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae |
|
||||||
// Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function |
|
||||||
// because of this. |
|
||||||
namespace test_template_alias_sfinae |
|
||||||
{ |
|
||||||
|
|
||||||
struct foo {}; |
|
||||||
|
|
||||||
template<typename T> |
|
||||||
using member = typename T::member_type; |
|
||||||
|
|
||||||
template<typename T> |
|
||||||
void func(...) {} |
|
||||||
|
|
||||||
template<typename T> |
|
||||||
void func(member<T>*) {} |
|
||||||
|
|
||||||
void test(); |
|
||||||
|
|
||||||
void test() { func<foo>(0); } |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
} // namespace cxx11 |
|
||||||
|
|
||||||
#endif // __cplusplus >= 201103L |
|
||||||
|
|
||||||
]]) |
|
||||||
|
|
||||||
|
|
||||||
dnl Tests for new features in C++14 |
|
||||||
|
|
||||||
m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ |
|
||||||
|
|
||||||
// If the compiler admits that it is not ready for C++14, why torture it? |
|
||||||
// Hopefully, this will speed up the test. |
|
||||||
|
|
||||||
#ifndef __cplusplus |
|
||||||
|
|
||||||
#error "This is not a C++ compiler" |
|
||||||
|
|
||||||
#elif __cplusplus < 201402L |
|
||||||
|
|
||||||
#error "This is not a C++14 compiler" |
|
||||||
|
|
||||||
#else |
|
||||||
|
|
||||||
namespace cxx14 |
|
||||||
{ |
|
||||||
|
|
||||||
namespace test_polymorphic_lambdas |
|
||||||
{ |
|
||||||
|
|
||||||
int |
|
||||||
test() |
|
||||||
{ |
|
||||||
const auto lambda = [](auto&&... args){ |
|
||||||
const auto istiny = [](auto x){ |
|
||||||
return (sizeof(x) == 1UL) ? 1 : 0; |
|
||||||
}; |
|
||||||
const int aretiny[] = { istiny(args)... }; |
|
||||||
return aretiny[0]; |
|
||||||
}; |
|
||||||
return lambda(1, 1L, 1.0f, '1'); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_binary_literals |
|
||||||
{ |
|
||||||
|
|
||||||
constexpr auto ivii = 0b0000000000101010; |
|
||||||
static_assert(ivii == 42, "wrong value"); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_generalized_constexpr |
|
||||||
{ |
|
||||||
|
|
||||||
template < typename CharT > |
|
||||||
constexpr unsigned long |
|
||||||
strlen_c(const CharT *const s) noexcept |
|
||||||
{ |
|
||||||
auto length = 0UL; |
|
||||||
for (auto p = s; *p; ++p) |
|
||||||
++length; |
|
||||||
return length; |
|
||||||
} |
|
||||||
|
|
||||||
static_assert(strlen_c("") == 0UL, ""); |
|
||||||
static_assert(strlen_c("x") == 1UL, ""); |
|
||||||
static_assert(strlen_c("test") == 4UL, ""); |
|
||||||
static_assert(strlen_c("another\0test") == 7UL, ""); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_lambda_init_capture |
|
||||||
{ |
|
||||||
|
|
||||||
int |
|
||||||
test() |
|
||||||
{ |
|
||||||
auto x = 0; |
|
||||||
const auto lambda1 = [a = x](int b){ return a + b; }; |
|
||||||
const auto lambda2 = [a = lambda1(x)](){ return a; }; |
|
||||||
return lambda2(); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_digit_seperators |
|
||||||
{ |
|
||||||
|
|
||||||
constexpr auto ten_million = 100'000'000; |
|
||||||
static_assert(ten_million == 100000000, ""); |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
namespace test_return_type_deduction |
|
||||||
{ |
|
||||||
|
|
||||||
auto f(int& x) { return x; } |
|
||||||
decltype(auto) g(int& x) { return x; } |
|
||||||
|
|
||||||
template < typename T1, typename T2 > |
|
||||||
struct is_same |
|
||||||
{ |
|
||||||
static constexpr auto value = false; |
|
||||||
}; |
|
||||||
|
|
||||||
template < typename T > |
|
||||||
struct is_same<T, T> |
|
||||||
{ |
|
||||||
static constexpr auto value = true; |
|
||||||
}; |
|
||||||
|
|
||||||
int |
|
||||||
test() |
|
||||||
{ |
|
||||||
auto x = 0; |
|
||||||
static_assert(is_same<int, decltype(f(x))>::value, ""); |
|
||||||
static_assert(is_same<int&, decltype(g(x))>::value, ""); |
|
||||||
return x; |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
||||||
|
|
||||||
} // namespace cxx14 |
|
||||||
|
|
||||||
#endif // __cplusplus >= 201402L |
|
||||||
|
|
||||||
]]) |
|
||||||
Loading…
Reference in new issue