Add C++11 support to ranges.h

Re-enable ranges-test
Fix a Visual Studio error about function not returning a value in printf.h
Fix a bug in .travis.yml
This commit is contained in:
Elias Kosunen 2018-06-05 12:21:26 +03:00
parent d1976cfb65
commit d79b096cc0
10 changed files with 45 additions and 136 deletions

View File

@ -1,103 +0,0 @@
# The default ``config.py``
# flake8: noqa
def set_prefs(prefs):
"""This function is called before opening the project"""
# Specify which files and folders to ignore in the project.
# Changes to ignored resources are not added to the history and
# VCSs. Also they are not returned in `Project.get_files()`.
# Note that ``?`` and ``*`` match all characters but slashes.
# '*.pyc': matches 'test.pyc' and 'pkg/test.pyc'
# 'mod*.pyc': matches 'test/mod1.pyc' but not 'mod/1.pyc'
# '.svn': matches 'pkg/.svn' and all of its children
# 'build/*.o': matches 'build/lib.o' but not 'build/sub/lib.o'
# 'build//*.o': matches 'build/lib.o' and 'build/sub/lib.o'
prefs['ignored_resources'] = [
'*.pyc', '*~', '.ropeproject', '.hg', '.svn', '_svn',
'.git', '.tox', '.env', 'env', 'venv', 'node_modules',
'bower_components'
]
# Specifies which files should be considered python files. It is
# useful when you have scripts inside your project. Only files
# ending with ``.py`` are considered to be python files by
# default.
#prefs['python_files'] = ['*.py']
# Custom source folders: By default rope searches the project
# for finding source folders (folders that should be searched
# for finding modules). You can add paths to that list. Note
# that rope guesses project source folders correctly most of the
# time; use this if you have any problems.
# The folders should be relative to project root and use '/' for
# separating folders regardless of the platform rope is running on.
# 'src/my_source_folder' for instance.
#prefs.add('source_folders', 'src')
# You can extend python path for looking up modules
#prefs.add('python_path', '~/python/')
# Should rope save object information or not.
prefs['save_objectdb'] = True
prefs['compress_objectdb'] = False
# If `True`, rope analyzes each module when it is being saved.
prefs['automatic_soa'] = True
# The depth of calls to follow in static object analysis
prefs['soa_followed_calls'] = 0
# If `False` when running modules or unit tests "dynamic object
# analysis" is turned off. This makes them much faster.
prefs['perform_doa'] = True
# Rope can check the validity of its object DB when running.
prefs['validate_objectdb'] = True
# How many undos to hold?
prefs['max_history_items'] = 32
# Shows whether to save history across sessions.
prefs['save_history'] = True
prefs['compress_history'] = False
# Set the number spaces used for indenting. According to
# :PEP:`8`, it is best to use 4 spaces. Since most of rope's
# unit-tests use 4 spaces it is more reliable, too.
prefs['indent_size'] = 4
# Builtin and c-extension modules that are allowed to be imported
# and inspected by rope.
prefs['extension_modules'] = []
# Add all standard c-extensions to extension_modules list.
prefs['import_dynload_stdmods'] = True
# If `True` modules with syntax errors are considered to be empty.
# The default value is `False`; When `False` syntax errors raise
# `rope.base.exceptions.ModuleSyntaxError` exception.
prefs['ignore_syntax_errors'] = False
# If `True`, rope ignores unresolvable imports. Otherwise, they
# appear in the importing namespace.
prefs['ignore_bad_imports'] = False
# If `True`, rope will insert new module imports as
# `from <package> import <module>` by default.
prefs['prefer_module_from_imports'] = False
# If `True`, rope will transform a comma list of imports into
# multiple separate import statements when organizing
# imports.
prefs['split_imports'] = False
# If `True`, rope will sort imports alphabetically by module name
# instead of alphabetically by import statement, with from imports
# after normal imports.
prefs['sort_imports_alphabetically'] = False
def project_opened(project):
"""This function is called after opening the project"""
# Do whatever you like here!

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -21,7 +21,7 @@ matrix:
- env: BUILD=Doc - env: BUILD=Doc
sudo: required sudo: required
# g++ 6 on Linux with C++14 # g++ 6 on Linux with C++14
- env: CXX=g++-6 BUILD=Debug STANDARD=14 - env: COMPILER=g++-6 BUILD=Debug STANDARD=14
compiler: gcc compiler: gcc
addons: addons:
apt: apt:
@ -30,7 +30,7 @@ matrix:
- ubuntu-toolchain-r-test - ubuntu-toolchain-r-test
packages: packages:
- g++-6 - g++-6
- env: CXX=g++-6 BUILD=Release STANDARD=14 - env: COMPILER=g++-6 BUILD=Release STANDARD=14
compiler: gcc compiler: gcc
addons: addons:
apt: apt:
@ -47,7 +47,7 @@ matrix:
compiler: clang compiler: clang
os: osx os: osx
# clang 6.0 on Linux with C++14 # clang 6.0 on Linux with C++14
- env: CXX=clang++-6.0 BUILD=Debug STANDARD=14 - env: COMPILER=clang++-6.0 BUILD=Debug STANDARD=14
compiler: clang compiler: clang
addons: addons:
apt: apt:
@ -59,7 +59,7 @@ matrix:
- llvm-toolchain-trusty - llvm-toolchain-trusty
- llvm-toolchain-trusty-6.0 - llvm-toolchain-trusty-6.0
# clang 4.0 on Linux with C++14 # clang 4.0 on Linux with C++14
- env: CXX=clang++-4.0 BUILD=Debug STANDARD=11 - env: COMPILER=clang++-4.0 BUILD=Debug STANDARD=11
compiler: clang compiler: clang
addons: addons:
apt: apt:
@ -71,10 +71,10 @@ matrix:
- llvm-toolchain-trusty - llvm-toolchain-trusty
- llvm-toolchain-trusty-4.0 - llvm-toolchain-trusty-4.0
# g++ 4.8 on Linux with C++11 # g++ 4.8 on Linux with C++11
- env: CXX=g++-4.8 BUILD=Debug STANDARD=11 - env: COMPILER=g++-4.8 BUILD=Debug STANDARD=11
compiler: gcc compiler: gcc
# g++ 4.4 on Linux with C++11 # g++ 4.4 on Linux with C++11
- env: CXX=g++-4.4 BUILD=Debug STANDARD=11 - env: COMPILER=g++-4.4 BUILD=Debug STANDARD=11
compiler: gcc compiler: gcc
addons: addons:
apt: apt:
@ -118,10 +118,11 @@ matrix:
- tree ./libs - tree ./libs
allow_failures: allow_failures:
# Errors # Errors
- env: CXX=g++-4.4 BUILD=Debug STANDARD=11 - env: COMPILER=g++-4.4 BUILD=Debug STANDARD=11
compiler: gcc compiler: gcc
before_script: before_script:
- if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then export CXX=${COMPILER}; fi
- if [[ "${BUILD}" != "Doc" ]]; then ${CXX} --version; fi - if [[ "${BUILD}" != "Doc" ]]; then ${CXX} --version; fi
script: script:

View File

@ -2919,7 +2919,7 @@ void basic_writer<Range>::write_double(T value, const format_specs &spec) {
typedef back_insert_range<internal::basic_buffer<char_type>> range; typedef back_insert_range<internal::basic_buffer<char_type>> range;
basic_writer<range> w{range(buffer)}; basic_writer<range> w{range(buffer)};
w.write(hi); w.write(hi);
unsigned digits = buffer.size(); size_t digits = buffer.size();
w.write('.'); w.write('.');
const unsigned max_digits = 18; const unsigned max_digits = 18;
while (digits++ < max_digits) { while (digits++ < max_digits) {

View File

@ -52,6 +52,7 @@ class printf_precision_handler: public function<int> {
typename std::enable_if<!std::is_integral<T>::value, int>::type typename std::enable_if<!std::is_integral<T>::value, int>::type
operator()(T) { operator()(T) {
FMT_THROW(format_error("precision is not integer")); FMT_THROW(format_error("precision is not integer"));
return 0; // Silence visual studio
} }
}; };
@ -193,6 +194,7 @@ class printf_width_handler: public function<unsigned> {
typename std::enable_if<!std::is_integral<T>::value, unsigned>::type typename std::enable_if<!std::is_integral<T>::value, unsigned>::type
operator()(T) { operator()(T) {
FMT_THROW(format_error("width is not integer")); FMT_THROW(format_error("width is not integer"));
return 0; // Silence Visual Studio
} }
}; };
} // namespace internal } // namespace internal

View File

@ -126,10 +126,9 @@ struct is_tuple_like {
static FMT_CONSTEXPR_DECL const bool value = static FMT_CONSTEXPR_DECL const bool value =
is_tuple_like_<T>::value && !is_range_<T>::value; is_tuple_like_<T>::value && !is_range_<T>::value;
}; };
} // namespace internal
// Check for integer_sequence // Check for integer_sequence
#if defined(__cpp_lib_integer_sequence) || FMT_MSC_VER >= 1910 #if defined(__cpp_lib_integer_sequence) || FMT_MSC_VER >= 1900
template <typename T, T... N> template <typename T, T... N>
using integer_sequence = std::integer_sequence<T, N...>; using integer_sequence = std::integer_sequence<T, N...>;
template <std::size_t... N> template <std::size_t... N>
@ -179,21 +178,13 @@ void for_each(Tuple &&tup, F &&f) {
template <typename TupleT, typename Char> template <typename TupleT, typename Char>
struct formatter<TupleT, Char, struct formatter<TupleT, Char,
typename std::enable_if<fmt::internal::is_tuple_like<TupleT>::value>::type> { typename std::enable_if<internal::is_tuple_like<TupleT>::value>::type> {
private:
fmt::formatting_tuple<Char> formatting; // C++11 generic lambda for format()
template <typename FormatContext>
template <typename ParseContext> struct format_each {
FMT_CONSTEXPR auto parse(ParseContext &ctx) -> decltype(ctx.begin()) { template <typename T>
return formatting.parse(ctx); void operator()(const T& v) {
}
template <typename FormatContext = format_context>
auto format(const TupleT &values, FormatContext &ctx) -> decltype(ctx.out()) {
auto out = ctx.out();
std::size_t i = 0;
internal::copy(formatting.prefix, out);
internal::for_each(values, [&](const auto &v) {
if (i > 0) { if (i > 0) {
if (formatting.add_prepostfix_space) { if (formatting.add_prepostfix_space) {
*out++ = ' '; *out++ = ' ';
@ -206,7 +197,28 @@ struct formatter<TupleT, Char,
format_to(out, "{}", v); format_to(out, "{}", v);
} }
++i; ++i;
}); }
formatting_tuple<Char>& formatting;
std::size_t& i;
typename std::add_lvalue_reference<decltype(std::declval<FormatContext>().out())>::type out;
};
public:
formatting_tuple<Char> formatting;
template <typename ParseContext>
FMT_CONSTEXPR auto parse(ParseContext &ctx) -> decltype(ctx.begin()) {
return formatting.parse(ctx);
}
template <typename FormatContext = format_context>
auto format(const TupleT &values, FormatContext &ctx) -> decltype(ctx.out()) {
auto out = ctx.out();
std::size_t i = 0;
internal::copy(formatting.prefix, out);
internal::for_each(values, format_each<FormatContext>{formatting, i, out});
if (formatting.add_prepostfix_space) { if (formatting.add_prepostfix_space) {
*out++ = ' '; *out++ = ' ';
} }
@ -215,13 +227,12 @@ struct formatter<TupleT, Char,
return ctx.out(); return ctx.out();
} }
}; };
#endif // FMT_USE_INTEGER_SEQUENCE
template <typename RangeT, typename Char> template <typename RangeT, typename Char>
struct formatter< RangeT, Char, struct formatter<RangeT, Char,
typename std::enable_if<fmt::internal::is_range<RangeT>::value>::type> { typename std::enable_if<internal::is_range<RangeT>::value>::type> {
fmt::formatting_range<Char> formatting; formatting_range<Char> formatting;
template <typename ParseContext> template <typename ParseContext>
FMT_CONSTEXPR auto parse(ParseContext &ctx) -> decltype(ctx.begin()) { FMT_CONSTEXPR auto parse(ParseContext &ctx) -> decltype(ctx.begin()) {

View File

@ -93,7 +93,7 @@ add_fmt_test(printf-test)
add_fmt_test(time-test) add_fmt_test(time-test)
add_fmt_test(util-test mock-allocator.h) add_fmt_test(util-test mock-allocator.h)
add_fmt_test(custom-formatter-test) add_fmt_test(custom-formatter-test)
#add_fmt_test(ranges-test) add_fmt_test(ranges-test)
if (HAVE_OPEN) if (HAVE_OPEN)
add_fmt_executable(posix-mock-test add_fmt_executable(posix-mock-test

View File

@ -30,7 +30,6 @@ TEST(RangesTest, FormatVector2) {
EXPECT_EQ("{{1, 2}, {3, 5}, {7, 11}}", ivf); EXPECT_EQ("{{1, 2}, {3, 5}, {7, 11}}", ivf);
} }
#if FMT_USE_INTEGER_SEQUENCE
TEST(RangesTest, FormatMap) { TEST(RangesTest, FormatMap) {
std::map<std::string, int32_t> simap{{"one", 1}, {"two", 2}}; std::map<std::string, int32_t> simap{{"one", 1}, {"two", 2}};
EXPECT_EQ("{(one, 1), (two, 2)}", fmt::format("{}", simap)); EXPECT_EQ("{(one, 1), (two, 2)}", fmt::format("{}", simap));
@ -87,4 +86,3 @@ TEST(RangesTest, FormatStruct) {
#endif // (__cplusplus > 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG > #endif // (__cplusplus > 201402L) || (defined(_MSVC_LANG) && _MSVC_LANG >
// 201402L && _MSC_VER >= 1910) // 201402L && _MSC_VER >= 1910)
#endif // FMT_USE_INTEGER_SEQUENCE