diff options
author | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2012-12-11 03:51:03 +0000 |
---|---|---|
committer | jsdelfino <jsdelfino@13f79535-47bb-0310-9956-ffa450edef68> | 2012-12-11 03:51:03 +0000 |
commit | ae0b7c0063db6236be2d7cf01ddbf2159f77c98c (patch) | |
tree | 2f64d65d018634b8728623e2ca99514541fab8aa /sca-cpp/trunk/modules/scheme/io.hpp | |
parent | 1f3796522a078dda5906395ba471d151ad694b6b (diff) |
Port kernel to C++11 and refactor some of the core modules. Convert functors to lambdas, and add C++ const, noexcept and inline annotations to get more efficient generated code.
git-svn-id: http://svn.us.apache.org/repos/asf/tuscany@1419985 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to '')
-rw-r--r-- | sca-cpp/trunk/modules/scheme/io.hpp | 150 |
1 files changed, 76 insertions, 74 deletions
diff --git a/sca-cpp/trunk/modules/scheme/io.hpp b/sca-cpp/trunk/modules/scheme/io.hpp index 8f9d70e7fe..02f6923c86 100644 --- a/sca-cpp/trunk/modules/scheme/io.hpp +++ b/sca-cpp/trunk/modules/scheme/io.hpp @@ -37,39 +37,38 @@ namespace tuscany { namespace scheme { -const value rightParenthesis(mklist<value>(")")); -const value leftParenthesis(mklist<value>("(")); -const value comment(mklist<value>(";")); +const value rightParenthesis(")"); +const value leftParenthesis("("); -const double stringToNumber(const string& str) { +inline const double stringToNumber(const string& str) { return atof(c_str(str)); } -const bool isWhitespace(const char ch) { +inline const bool isWhitespace(const char ch) { return ch != -1 && isspace(ch); } -const bool isIdentifierStart(const char ch) { +inline const bool isIdentifierStart(const char ch) { return ch != -1 && !isspace(ch) && !isdigit(ch); } -const bool isIdentifierPart(const char ch) { +inline const bool isIdentifierPart(const char ch) { return ch != -1 && !isspace(ch) && ch != '(' && ch != ')'; } -const bool isDigit(const char ch) { +inline const bool isDigit(const char ch) { return isdigit(ch) || ch == '.'; } -const bool isLeftParenthesis(const value& token) { +inline const bool isLeftParenthesis(const value& token) { return leftParenthesis == token; } -const bool isRightParenthesis(const value& token) { +inline const bool isRightParenthesis(const value& token) { return rightParenthesis == token; } -const char readChar(istream& in) { +inline const char readChar(istream& in) { if(in.eof()) { return -1; } @@ -77,14 +76,14 @@ const char readChar(istream& in) { return c; } -const char peekChar(istream& in) { +inline const char peekChar(istream& in) { if(eof(in)) return -1; char c = (char)peek(in); return c; } -const bool isQuote(const value& token) { +inline const bool isQuote(const value& token) { return token == quoteSymbol; } @@ -93,9 +92,9 @@ const value readQuoted(istream& in); const value readIdentifier(const char chr, istream& in); const value readString(istream& in); const value readNumber(const char chr, istream& in); -const value readValue(istream& in); +const failable<value> readValue(istream& in); -const failable<value> readToken(istream& in) { +inline const failable<value> readToken(istream& in) { const char firstChar = readChar(in); if(isWhitespace(firstChar)) return readToken(in); @@ -119,18 +118,19 @@ const failable<value> readToken(istream& in) { return readToken(in); } -const failable<value> skipComment(istream& in) { - const char nextChar = readChar(in); - if (nextChar == '\n') - return readToken(in); - return skipComment(in); +inline const failable<value> skipComment(istream& in) { + while(true) { + const char nextChar = readChar(in); + if (nextChar == '\n') + return readToken(in); + } } -const value readQuoted(istream& in) { - return mklist(quoteSymbol, readValue(in)); +inline const value readQuoted(istream& in) { + return mklist(quoteSymbol, content(readValue(in))); } -const list<value> readList(const list<value>& listSoFar, istream& in) { +inline const list<value> readList(const list<value>& listSoFar, istream& in) { const failable<value> ftoken = readToken(in); if (!hasContent(ftoken)) return reverse(listSoFar); @@ -142,95 +142,97 @@ const list<value> readList(const list<value>& listSoFar, istream& in) { return readList(cons(token, listSoFar), in); } -const string listToString(const list<char>& l) { - if(isNil(l)) - return ""; - const char buf[1] = { car(l) }; - return string(buf, 1) + listToString(cdr(l)); -} - -const list<char> readIdentifierHelper(const list<char>& listSoFar, istream& in) { - const char nextChar = peekChar(in); - if(isIdentifierPart(nextChar)) - return readIdentifierHelper(cons(readChar(in), listSoFar), in); - return reverse(listSoFar); +inline const string readIdentifierHelper(const char chr, istream& in) { + ostringstream buf; + buf << chr; + while(true) { + const char nextChar = peekChar(in); + if(!isIdentifierPart(nextChar)) + return str(buf); + buf << readChar(in); + } } -const value readIdentifier(const char chr, istream& in) { - const value val = c_str(listToString(readIdentifierHelper(mklist(chr), in))); +inline const value readIdentifier(const char chr, istream& in) { + const value val = c_str(readIdentifierHelper(chr, in)); if (val == "false") return value((bool)false); if (val == "true") return value((bool)true); if (val == "nil") - return value(); + return nilValue; return val; } -const list<char> readStringHelper(const list<char>& listSoFar, istream& in) { - const char nextChar = readChar(in); - if(nextChar == -1 || nextChar == '"') - return reverse(listSoFar); - if (nextChar == '\\') { - const char escapedChar = readChar(in); - if (escapedChar == -1) - return reverse(listSoFar); - return readStringHelper(cons(escapedChar, listSoFar), in); +inline const value readString(istream& in) { + ostringstream buf; + while(true) { + const char nextChar = readChar(in); + if(nextChar == -1 || nextChar == '"') + return (value)str(buf); + if (nextChar == '\\') { + const char escapedChar = readChar(in); + if (escapedChar == -1) + return (value)str(buf); + buf << escapedChar; + } + buf << nextChar; } - return readStringHelper(cons(nextChar, listSoFar), in); } -const value readString(istream& in) { - return listToString(readStringHelper(list<char>(), in)); -} - -const list<char> readNumberHelper(const list<char>& listSoFar, istream& in) { - const char nextChar = peekChar(in); - if(isDigit(nextChar)) - return readNumberHelper(cons(readChar(in), listSoFar), in); - return reverse(listSoFar); -} - -const value readNumber(const char chr, istream& in) { - return stringToNumber(listToString(readNumberHelper(mklist(chr), in))); +inline const value readNumber(const char chr, istream& in) { + ostringstream buf; + buf << chr; + while(true) { + const char nextChar = peekChar(in); + if(!isDigit(nextChar)) + return stringToNumber(str(buf)); + buf << readChar(in); + } } -const value readValue(istream& in) { +inline const failable<value> readValue(istream& in) { const failable<value> fnextToken = readToken(in); if (!hasContent(fnextToken)) - return value(); + return nilValue; const value nextToken = content(fnextToken); if(isLeftParenthesis(nextToken)) - return readList(list<value>(), in); + return (value)readList(nilListValue, in); return nextToken; } -const value readValue(const string s) { +inline const failable<value> readValue(const string& s) { istringstream in(s); const failable<value> fnextToken = readToken(in); if (!hasContent(fnextToken)) - return value(); + return nilValue; const value nextToken = content(fnextToken); if(isLeftParenthesis(nextToken)) - return readList(list<value>(), in); + return (value)readList(nilListValue, in); return nextToken; } -const bool writeValue(const value& val, ostream& out) { +inline const failable<value> readValue(const list<string>& l) { + ostringstream os; + write(l, os); + return readValue(str(os)); +} + +inline const failable<ostream&> writeValue(const value& val, ostream& out) { out << val; - return true; + return out; } -const string writeValue(const value& val) { +inline const failable<list<string> > writeValue(const value& val) { ostringstream out; out << val; - return str(out); + return mklist<string>(str(out)); } -const value readScript(istream& in) { - const value val = readValue(in); +inline const value readScript(istream& in) { + const value val = content(readValue(in)); if (isNil(val)) - return list<value>(); + return nilListValue; return cons(val, (list<value>)readScript(in)); } |