aboutsummaryrefslogtreecommitdiff
path: root/NvCloth/samples/external/assimp-4.1.0/code/LineSplitter.h
diff options
context:
space:
mode:
Diffstat (limited to 'NvCloth/samples/external/assimp-4.1.0/code/LineSplitter.h')
-rw-r--r--NvCloth/samples/external/assimp-4.1.0/code/LineSplitter.h243
1 files changed, 243 insertions, 0 deletions
diff --git a/NvCloth/samples/external/assimp-4.1.0/code/LineSplitter.h b/NvCloth/samples/external/assimp-4.1.0/code/LineSplitter.h
new file mode 100644
index 0000000..003b42d
--- /dev/null
+++ b/NvCloth/samples/external/assimp-4.1.0/code/LineSplitter.h
@@ -0,0 +1,243 @@
+/*
+Open Asset Import Library (assimp)
+----------------------------------------------------------------------
+
+Copyright (c) 2006-2017, assimp team
+
+All rights reserved.
+
+Redistribution and use of this software in source and binary forms,
+with or without modification, are permitted provided that the
+following conditions are met:
+
+* Redistributions of source code must retain the above
+ copyright notice, this list of conditions and the
+ following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the
+ following disclaimer in the documentation and/or other
+ materials provided with the distribution.
+
+* Neither the name of the assimp team, nor the names of its
+ contributors may be used to endorse or promote products
+ derived from this software without specific prior
+ written permission of the assimp team.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+----------------------------------------------------------------------
+*/
+
+/** @file LineSplitter.h
+ * @brief LineSplitter, a helper class to iterate through all lines
+ * of a file easily. Works with StreamReader.
+ */
+#ifndef INCLUDED_LINE_SPLITTER_H
+#define INCLUDED_LINE_SPLITTER_H
+
+#include <stdexcept>
+
+#include "StreamReader.h"
+#include "ParsingUtils.h"
+
+namespace Assimp {
+
+// ------------------------------------------------------------------------------------------------
+/** Usage:
+@code
+for(LineSplitter splitter(stream);splitter;++splitter) {
+
+ if (*splitter == "hi!") {
+ ...
+ }
+ else if (splitter->substr(0,5) == "hello") {
+ ...
+ // access the third token in the line (tokens are space-separated)
+ if (strtol(splitter[2]) > 5) { .. }
+ }
+
+ std::cout << "Current line is: " << splitter.get_index() << std::endl;
+}
+@endcode
+*/
+// ------------------------------------------------------------------------------------------------
+class LineSplitter {
+public:
+ typedef size_t line_idx;
+
+ // -----------------------------------------
+ /** construct from existing stream reader
+ note: trim is *always* assumed true if skyp_empty_lines==true
+ */
+ LineSplitter(StreamReaderLE& stream, bool skip_empty_lines = true, bool trim = true)
+ : idx( 0 )
+ , stream(stream)
+ , swallow()
+ , skip_empty_lines(skip_empty_lines)
+ , trim(trim) {
+ cur.reserve(1024);
+ operator++();
+
+ idx = 0;
+ }
+
+ ~LineSplitter() {
+ // empty
+ }
+
+public:
+
+ // -----------------------------------------
+ /** pseudo-iterator increment */
+ LineSplitter& operator++() {
+ if(swallow) {
+ swallow = false;
+ return *this;
+ }
+ if (!*this) {
+ throw std::logic_error("End of file, no more lines to be retrieved.");
+ }
+ char s;
+ cur.clear();
+ while(stream.GetRemainingSize() && (s = stream.GetI1(),1)) {
+ if (s == '\n' || s == '\r') {
+ if (skip_empty_lines) {
+ while (stream.GetRemainingSize() && ((s = stream.GetI1()) == ' ' || s == '\r' || s == '\n'));
+ if (stream.GetRemainingSize()) {
+ stream.IncPtr(-1);
+ }
+ }
+ else {
+ // skip both potential line terminators but don't read past this line.
+ if (stream.GetRemainingSize() && (s == '\r' && stream.GetI1() != '\n')) {
+ stream.IncPtr(-1);
+ }
+ if (trim) {
+ while (stream.GetRemainingSize() && ((s = stream.GetI1()) == ' ' || s == '\t'));
+ if (stream.GetRemainingSize()) {
+ stream.IncPtr(-1);
+ }
+ }
+ }
+ break;
+ }
+ cur += s;
+ }
+ ++idx;
+ return *this;
+ }
+
+ // -----------------------------------------
+ LineSplitter& operator++(int) {
+ return ++(*this);
+ }
+
+ // -----------------------------------------
+ /** get a pointer to the beginning of a particular token */
+ const char* operator[] (size_t idx) const {
+ const char* s = operator->()->c_str();
+
+ SkipSpaces(&s);
+ for(size_t i = 0; i < idx; ++i) {
+
+ for(;!IsSpace(*s); ++s) {
+ if(IsLineEnd(*s)) {
+ throw std::range_error("Token index out of range, EOL reached");
+ }
+ }
+ SkipSpaces(&s);
+ }
+ return s;
+ }
+
+ // -----------------------------------------
+ /** extract the start positions of N tokens from the current line*/
+ template <size_t N>
+ void get_tokens(const char* (&tokens)[N]) const {
+ const char* s = operator->()->c_str();
+
+ SkipSpaces(&s);
+ for(size_t i = 0; i < N; ++i) {
+ if(IsLineEnd(*s)) {
+
+ throw std::range_error("Token count out of range, EOL reached");
+
+ }
+ tokens[i] = s;
+
+ for(;*s && !IsSpace(*s); ++s);
+ SkipSpaces(&s);
+ }
+ }
+
+ // -----------------------------------------
+ /** member access */
+ const std::string* operator -> () const {
+ return &cur;
+ }
+
+ std::string operator* () const {
+ return cur;
+ }
+
+ // -----------------------------------------
+ /** boolean context */
+ operator bool() const {
+ return stream.GetRemainingSize()>0;
+ }
+
+ // -----------------------------------------
+ /** line indices are zero-based, empty lines are included */
+ operator line_idx() const {
+ return idx;
+ }
+
+ line_idx get_index() const {
+ return idx;
+ }
+
+ // -----------------------------------------
+ /** access the underlying stream object */
+ StreamReaderLE& get_stream() {
+ return stream;
+ }
+
+ // -----------------------------------------
+ /** !strcmp((*this)->substr(0,strlen(check)),check) */
+ bool match_start(const char* check) {
+ const size_t len = strlen(check);
+
+ return len <= cur.length() && std::equal(check,check+len,cur.begin());
+ }
+
+
+ // -----------------------------------------
+ /** swallow the next call to ++, return the previous value. */
+ void swallow_next_increment() {
+ swallow = true;
+ }
+
+private:
+ LineSplitter( const LineSplitter & );
+ LineSplitter &operator = ( const LineSplitter & );
+
+private:
+ line_idx idx;
+ std::string cur;
+ StreamReaderLE& stream;
+ bool swallow, skip_empty_lines, trim;
+};
+
+}
+#endif // INCLUDED_LINE_SPLITTER_H