bump compiler

master
Daniel Kolesa 2017-01-29 21:22:40 +01:00
parent 58a361e6e0
commit 632147c5fb
4 changed files with 76 additions and 24 deletions

View File

@ -1,4 +1,4 @@
OSTD_CXXFLAGS = -O2 -g -std=c++14 -Wall -Wextra -Wshadow -Wold-style-cast -I. OSTD_CXXFLAGS = -O2 -g -std=c++1z -Wall -Wextra -Wshadow -Wold-style-cast -I.
EXAMPLES_OBJ = \ EXAMPLES_OBJ = \
examples/format \ examples/format \

View File

@ -1,6 +1,6 @@
# octastd # octastd
OctaSTD is an extension of the C++14 standard library which mainly provides OctaSTD is an extension of the C++17 standard library which mainly provides
ranges (to replace iterators) but also various other utilities like proper ranges (to replace iterators) but also various other utilities like proper
streams, string formatting, concurrency utilities and others. It's meant streams, string formatting, concurrency utilities and others. It's meant
to replace the more poorly designed parts of the C++ standard library to to replace the more poorly designed parts of the C++ standard library to
@ -8,42 +8,45 @@ make the language easier and more convenient to use.
Documentation for OctaSTD can be found at https://wiki.octaforge.org/docs/octastd. Documentation for OctaSTD can be found at https://wiki.octaforge.org/docs/octastd.
Full C++14 support is required in your compiler. It's not necessary that your compiler fully supports C++17, only C++14
language is used, but new C++17 containers have to be present, such as
`string_view` and `optional`.
## Supported compilers ## Supported compilers
Compiler | Version Compiler | Version
-------- | ------- -------- | -------
gcc/g++ | 5.4+, 6+ gcc/g++ | 7+
clang | 3.8+ (most platforms including LLVM for macOS), 8.0.0+ (macOS Xcode) clang | 4+
Other C++14 compliant compilers might work as well. OctaSTD does not utilize You need those mainly to get the right standard library version (libstdc++
compiler specific extensions. or libc++). Other compilers might work as well, as long as the necessary
standard library features are supplied.
While Clang 3.6 does implement a sufficient level of C++14 support, it suffers
from a bug in its variable template implementation that prevents OctaSTD from
functioning. Therefore version 3.8 or higher is necessary (where this bug was
finally fixed).
GCC has implemented a sufficient feature level of C++14 since version 5.1, but
also is too buggy until version 5.4. Version 5.1 and 5.2 have variable template
partial specialization issues and version 5.3 has an internal compiler error
triggered by the tuple implementation. Version 5.4 appears to be the first one
to compile this without issues. GCC 6.1 also appears to compile without problems.
MSVC++ is unsupported and for the time being will remain unsupported. As of MS MSVC++ is unsupported and for the time being will remain unsupported. As of MS
Visual Studio 2017 RC, basic C++11 features are still broken and prevent usage Visual Studio 2017 RC, basic C++11 features are still broken and prevent usage
of the library, with no reasonable workarounds. I will be testing new versions of the library, with no reasonable workarounds. I will be testing new versions
as they get released and mark it supported as soon as it actually works, but no as they get released and mark it supported as soon as it actually works, but no
active effort will be put towards making it work. On Windows, you're free to active effort will be put towards making it work. On Windows, you're free to
use GCC/Clang or if you need the Visual Studio environment, the Visual Studio use GCC/Clang, if you need Visual Studio, LLVM integration exists.
version of Clang with MS Codegen should work just fine.
## Why is C++17 necessary?
Sadly, it's not possible to properly integrate `std::string` and `std::hash`
with OctaSTD ranges without utilizing `std::string_view`. Also, C++17 provides
library features that OctaSTD would have to implement otherwise, which would
lead to potentially incompatible APIs. However, OctaSTD does not make wide
use of C++17 language features, limiting itself mostly to library features
which have been present for more or less a pretty long time (in experimental
namespace for example) which should avoid buggy behavior. There is still the
problem of requiring a very recent toolchain, but this situation should solve
itself in near future.
## Supported operating systems ## Supported operating systems
Most of OctaSTD is entirely platform independent and relies only on the standard Most of OctaSTD is entirely platform independent and relies only on the
library. Therefore it can be used on any operating system that provides a C++14 standard library. Therefore it can be used on any operating system that
compiler and library implementation. provides the right toolchain.
There are certain parts (currently the filesystem module) that however do rely There are certain parts (currently the filesystem module) that however do rely
on system specific APIs. These are restricted to POSIX compliant operating on system specific APIs. These are restricted to POSIX compliant operating

View File

@ -10,6 +10,9 @@
#include <stddef.h> #include <stddef.h>
#include <ctype.h> #include <ctype.h>
#include <string>
#include <string_view>
#include "ostd/utility.hh" #include "ostd/utility.hh"
#include "ostd/range.hh" #include "ostd/range.hh"
#include "ostd/vector.hh" #include "ostd/vector.hh"
@ -208,6 +211,11 @@ diffsize:
return c; return c;
} }
/* that way we can assign, append etc to std::string */
operator std::basic_string_view<RemoveCv<T>>() const {
return std::basic_string_view<RemoveCv<T>>{data(), size()};
}
private: private:
T *p_beg, *p_end; T *p_beg, *p_end;
}; };
@ -246,6 +254,20 @@ inline bool starts_with(ConstCharRange a, ConstCharRange b) {
return a.slice(0, b.size()) == b; return a.slice(0, b.size()) == b;
} }
template<typename T>
struct ranged_traits<std::basic_string<T>> {
static CharRangeBase<T> iter(std::basic_string<T> &v) {
return CharRangeBase<T>{v.data(), v.size()};
}
};
template<typename T>
struct ranged_traits<std::basic_string<T> const> {
static CharRangeBase<T const> iter(std::basic_string<T> const &v) {
return CharRangeBase<T const>{v.data(), v.size()};
}
};
template<typename T, typename A> template<typename T, typename A>
class StringBase { class StringBase {
using StrPair = detail::CompressedPair<AllocatorPointer<A>, A>; using StrPair = detail::CompressedPair<AllocatorPointer<A>, A>;
@ -951,6 +973,15 @@ struct ToString<String> {
} }
}; };
template<>
struct ToString<std::string> {
using Argument = std::string;
using Result = String;
String operator()(Argument const &s) {
return iter(s);
}
};
template<> template<>
struct ToString<CharRange> { struct ToString<CharRange> {
using Argument = CharRange; using Argument = CharRange;
@ -1124,4 +1155,22 @@ inline TempCString<R> to_temp_cstr(
} /* namespace ostd */ } /* namespace ostd */
namespace std {
template<>
struct hash<ostd::CharRange> {
size_t operator()(ostd::CharRange const &v) {
return hash<std::string_view>{}(v);
}
};
template<>
struct hash<ostd::ConstCharRange> {
size_t operator()(ostd::CharRange const &v) {
return hash<std::string_view>{}(v);
}
};
}
#endif #endif

View File

@ -25,7 +25,7 @@ int main() {
/* configurable section */ /* configurable section */
auto compiler = env_get("CXX").value_or("c++"); auto compiler = env_get("CXX").value_or("c++");
auto cxxflags = "-std=c++14 -I. -Wall -Wextra -Wshadow -Wold-style-cast " auto cxxflags = "-std=c++1z -I. -Wall -Wextra -Wshadow -Wold-style-cast "
"-Wno-missing-braces"; /* clang false positive */ "-Wno-missing-braces"; /* clang false positive */
auto testdir = env_get("TESTDIR").value_or("tests"); auto testdir = env_get("TESTDIR").value_or("tests");
auto srcext = ".cc"; auto srcext = ".cc";