13 changed files with 120 additions and 1034 deletions
@ -1,26 +1 @@
|
||||
# |
||||
# 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 |
||||
build/ |
||||
|
||||
@ -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