/* Copyright (c) 2012-2017 The ANTLR Project. All rights reserved. * Use of this file is governed by the BSD 3-clause license that * can be found in the LICENSE.txt file in the project root. */ #pragma once #include "antlr4-common.h" namespace antlrcpp { std::string join(std::vector strings, const std::string &separator); std::map toMap(const std::vector &keys); std::string escapeWhitespace(std::string str, bool escapeSpaces); std::string toHexString(const int t); std::string arrayToString(const std::vector &data); std::string replaceString(const std::string &s, const std::string &from, const std::string &to); std::vector split(const std::string &s, const std::string &sep, int count); std::string indent(const std::string &s, const std::string &indentation, bool includingFirst = true); // Using RAII + a lambda to implement a "finally" replacement. struct FinalAction { FinalAction(std::function f) : _cleanUp { f } {} FinalAction(FinalAction &&other) : _cleanUp(std::move(other._cleanUp)), _enabled(other._enabled) { other._enabled = false; // Don't trigger the lambda after ownership has moved. } ~FinalAction() { if (_enabled) _cleanUp(); } void disable() { _enabled = false; } private: std::function _cleanUp; bool _enabled {true}; }; ANTLR4CPP_PUBLIC FinalAction finally(std::function f); // Convenience functions to avoid lengthy dynamic_cast() != nullptr checks in many places. template inline bool is(T2 *obj) { // For pointer types. return dynamic_cast::type>(obj) != nullptr; } template inline bool is(Ref const& obj) { // For shared pointers. return dynamic_cast(obj.get()) != nullptr; } template std::string toString(const T &o) { std::stringstream ss; // typeid gives the mangled class name, but that's all what's possible // in a portable way. ss << typeid(o).name() << "@" << std::hex << reinterpret_cast(&o); return ss.str(); } // Get the error text from an exception pointer or the current exception. std::string what(std::exception_ptr eptr = std::current_exception()); class SingleWriteMultipleReadLock { public: void readLock(); void readUnlock(); void writeLock(); void writeUnlock(); private: std::condition_variable _readerGate; std::condition_variable _writerGate; std::mutex _mutex; size_t _activeReaders = 0; size_t _waitingWriters = 0; size_t _activeWriters = 0; }; } // namespace antlrcpp