constexpr fixes for Visual Studio

This commit is contained in:
Jason Turner 2017-08-22 12:02:42 -06:00
parent b51b52dea9
commit ac8f876347

View File

@ -241,12 +241,12 @@ namespace chaiscript
constexpr auto begin() const noexcept constexpr auto begin() const noexcept
{ {
return all_data.begin(); return &all_data[0];
} }
constexpr auto end() const noexcept constexpr auto end() const noexcept
{ {
return all_data.end(); return begin() + all_data.size();
} }
constexpr decltype(auto) operator[](const std::size_t pos) const noexcept { constexpr decltype(auto) operator[](const std::size_t pos) const noexcept {
@ -321,20 +321,25 @@ namespace chaiscript
{ {
constexpr Position() = default; constexpr Position() = default;
constexpr Position(std::string::const_iterator t_pos, std::string::const_iterator t_end) noexcept constexpr Position(const char * t_pos, const char * t_end) noexcept
: line(1), col(1), m_pos(t_pos), m_end(t_end), m_last_col(1) : line(1), col(1), m_pos(t_pos), m_end(t_end), m_last_col(1)
{ {
} }
static std::string str(const Position &t_begin, const Position &t_end) noexcept { static std::string str(const Position &t_begin, const Position &t_end) noexcept {
return std::string(t_begin.m_pos, t_end.m_pos); if (t_begin.m_pos != nullptr && t_end.m_pos != nullptr) {
return std::string(t_begin.m_pos, t_end.m_pos);
} else {
return {};
}
} }
Position &operator++() noexcept { constexpr Position &operator++() noexcept {
if (m_pos != m_end) { if (m_pos != m_end) {
if (*m_pos == '\n') { if (*m_pos == '\n') {
++line; ++line;
m_last_col = std::exchange(col, 1); m_last_col = col;
col = 1;
} else { } else {
++col; ++col;
} }
@ -393,8 +398,8 @@ namespace chaiscript
return m_pos != m_end; return m_pos != m_end;
} }
size_t remaining() const noexcept { constexpr size_t remaining() const noexcept {
return static_cast<size_t>(std::distance(m_pos, m_end)); return static_cast<size_t>(m_end - m_pos);
} }
constexpr const char& operator*() const noexcept { constexpr const char& operator*() const noexcept {
@ -409,8 +414,8 @@ namespace chaiscript
int col = -1; int col = -1;
private: private:
std::string::const_iterator m_pos; const char *m_pos = nullptr;
std::string::const_iterator m_end; const char *m_end = nullptr;
int m_last_col = -1; int m_last_col = -1;
}; };
@ -2605,7 +2610,9 @@ namespace chaiscript
/// Parses the given input string, tagging parsed ast_nodes with the given m_filename. /// Parses the given input string, tagging parsed ast_nodes with the given m_filename.
AST_NodePtr parse_internal(const std::string &t_input, std::string t_fname) { AST_NodePtr parse_internal(const std::string &t_input, std::string t_fname) {
m_position = Position(t_input.begin(), t_input.end()); const auto begin = t_input.empty() ? nullptr : &t_input.front();
const auto end = begin == nullptr ? nullptr : begin + t_input.size();
m_position = Position(begin, end);
m_filename = std::make_shared<std::string>(std::move(t_fname)); m_filename = std::make_shared<std::string>(std::move(t_fname));
if ((t_input.size() > 1) && (t_input[0] == '#') && (t_input[1] == '!')) { if ((t_input.size() > 1) && (t_input[0] == '#') && (t_input[1] == '!')) {