From ae0b7c0063db6236be2d7cf01ddbf2159f77c98c Mon Sep 17 00:00:00 2001 From: jsdelfino Date: Tue, 11 Dec 2012 03:51:03 +0000 Subject: 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 --- sca-cpp/trunk/modules/atom/atom-test.cpp | 268 +++++++++++++++---------------- sca-cpp/trunk/modules/atom/atom.hpp | 85 +++++----- 2 files changed, 173 insertions(+), 180 deletions(-) (limited to 'sca-cpp/trunk/modules/atom') diff --git a/sca-cpp/trunk/modules/atom/atom-test.cpp b/sca-cpp/trunk/modules/atom/atom-test.cpp index 479ed64f29..056e9ea965 100644 --- a/sca-cpp/trunk/modules/atom/atom-test.cpp +++ b/sca-cpp/trunk/modules/atom/atom-test.cpp @@ -38,100 +38,100 @@ ostream* writer(const string& s, ostream* os) { const string itemEntry( "\n" - "\n" - " item\n" - " cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\n" - " \n" - " jane@example.com\n" - " \n" - " Fri Jan 01 08:11:36 PDT 2012\n" - " \n" - " \n" - " Apple\n" - " $2.99\n" - " \n" - " \n" - " \n" + "" + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" + "" + "jane@example.com" + "" + "Fri Jan 01 08:11:36 PDT 2012" + "" + "" + "Apple" + "$2.99" + "" + "" + "" "\n"); const string itemTextEntry("\n" - "\n" - " item\n" - " cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\n" - " \n" - " jane@example.com\n" - " \n" - " Fri Jan 01 08:11:36 PDT 2012\n" - " Apple\n" - " \n" + "" + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" + "" + "jane@example.com" + "" + "Fri Jan 01 08:11:36 PDT 2012" + "Apple" + "" "\n"); const string itemNoContentEntry("\n" - "\n" - " item\n" - " cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\n" - " \n" - " jane\n" - " \n" - " Fri Jan 01 08:11:36 PDT 2012\n" - " \n" + "" + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" + "" + "jane" + "" + "Fri Jan 01 08:11:36 PDT 2012" + "" "\n"); const string incompleteEntry("\n" - " item\n" - " \n" - " \n" - " Orange\n" - " 3.55\n" - " \n" - " \n" + "item" + "" + "" + "Orange" + "3.55" + "" + "" "\n"); const string completedEntry("\n" - "\n" - " item\n" - " \n" - " \n" - " \n" - " Orange\n" - " 3.55\n" - " \n" - " \n" - " \n" + "" + "item" + "" + "" + "" + "Orange" + "3.55" + "" + "" + "" "\n"); -bool testEntry() { +const bool testEntry() { { - const list i = list() + element + value("item") - + value(list() + element + value("name") + value(string("Apple"))) - + value(list() + element + value("price") + value(string("$2.99"))); - const list a = list() + (list() + element + value("entry") - + value(list() + element + value("title") + value(string("item"))) - + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) - + value(list() + element + value("author") + value(string("jane@example.com"))) - + value(list() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))) - + value(list() + element + value("content") + value(i))); + const list i = nilListValue + element + value("item") + + value(nilListValue + element + value("name") + value(string("Apple"))) + + value(nilListValue + element + value("price") + value(string("$2.99"))); + const list a = nilListValue + (nilListValue + element + value("entry") + + value(nilListValue + element + value("title") + value(string("item"))) + + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(nilListValue + element + value("author") + value(string("jane@example.com"))) + + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))) + + value(nilListValue + element + value("content") + value(i))); ostringstream os; writeATOMEntry(writer, &os, a); assert(str(os) == itemEntry); } { - const list a = list() + (list() + element + value("entry") - + value(list() + element + value("title") + value(string("item"))) - + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) - + value(list() + element + value("author") + value(string("jane@example.com"))) - + value(list() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))) - + value(list() + element + value("content") + value(string("Apple")))); + const list a = nilListValue + (nilListValue + element + value("entry") + + value(nilListValue + element + value("title") + value(string("item"))) + + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(nilListValue + element + value("author") + value(string("jane@example.com"))) + + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))) + + value(nilListValue + element + value("content") + value(string("Apple")))); ostringstream os; writeATOMEntry(writer, &os, a); assert(str(os) == itemTextEntry); } { - const list a = list() + (list() + element + value("entry") - + value(list() + element + value("title") + value(string("item"))) - + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) - + value(list() + element + value("author") + value(string("jane"))) - + value(list() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))); + const list a = nilListValue + (nilListValue + element + value("entry") + + value(nilListValue + element + value("title") + value(string("item"))) + + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(nilListValue + element + value("author") + value(string("jane"))) + + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))); ostringstream os; writeATOMEntry(writer, &os, a); assert(str(os) == itemNoContentEntry); @@ -164,54 +164,54 @@ bool testEntry() { } const string emptyFeed("\n" - "\n" - " Feed\n" - " 1234\n" + "" + "Feed" + "1234" "\n"); const string itemFeed("\n" - "\n" - " Feed\n" - " 1234\n" - " \n" - " item\n" - " cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b\n" - " \n" - " jane@example.com\n" - " \n" - " Fri Jan 01 08:11:36 PDT 2012\n" - " \n" - " \n" - " Apple\n" - " $2.99\n" - " \n" - " \n" - " \n" - " \n" - " \n" - " item\n" - " cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c\n" - " \n" - " jane@example.com\n" - " \n" - " Fri Jan 01 08:11:36 PDT 2012\n" - " \n" - " \n" - " Orange\n" - " $3.55\n" - " \n" - " \n" - " \n" - " \n" + "" + "Feed" + "1234" + "" + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b" + "" + "jane@example.com" + "" + "Fri Jan 01 08:11:36 PDT 2012" + "" + "" + "Apple" + "$2.99" + "" + "" + "" + "" + "" + "item" + "cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c" + "" + "jane@example.com" + "" + "Fri Jan 01 08:11:36 PDT 2012" + "" + "" + "Orange" + "$3.55" + "" + "" + "" + "" "\n"); -bool testFeed() { +const bool testFeed() { { - const list a = list() + (list() + element + value("feed") - + value(list() + element + value("title") + value(string("Feed"))) - + value(list() + element + value("id") + value(string("1234"))) - + value(list() + element + value("author") + value(string("jane@example.com"))) - + value(list() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))); + const list a = nilListValue + (nilListValue + element + value("feed") + + value(nilListValue + element + value("title") + value(string("Feed"))) + + value(nilListValue + element + value("id") + value(string("1234"))) + + value(nilListValue + element + value("author") + value(string("jane@example.com"))) + + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012")))); ostringstream os; writeATOMFeed(writer, &os, a); assert(str(os) == emptyFeed); @@ -223,31 +223,31 @@ bool testFeed() { assert(str(os) == emptyFeed); } { - const list i1 = list() + element + "item" - + (list() + element + "name" + "Apple") - + (list() + element + "price" + "$2.99"); + const list i1 = nilListValue + element + "item" + + (nilListValue + element + "name" + "Apple") + + (nilListValue + element + "price" + "$2.99"); - const list i2 = list() + element + "item" - + (list() + element + "name" + "Orange") - + (list() + element + "price" + "$3.55"); + const list i2 = nilListValue + element + "item" + + (nilListValue + element + "name" + "Orange") + + (nilListValue + element + "price" + "$3.55"); - const list i = list() - + value(list() + element + value("entry") - + value(list() + element + value("title") + value(string("item"))) - + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) - + value(list() + element + value("author") + value(string("jane@example.com"))) - + value(list() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))) - + value(list() + element + value("content") + value(i1))) - + value(list() + element + value("entry") - + value(list() + element + value("title") + value(string("item"))) - + value(list() + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c"))) - + value(list() + element + value("author") + value(string("jane@example.com"))) - + value(list() + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))) - + value(list() + element + value("content") + value(i2))); + const list i = nilListValue + + value(nilListValue + element + value("entry") + + value(nilListValue + element + value("title") + value(string("item"))) + + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83b"))) + + value(nilListValue + element + value("author") + value(string("jane@example.com"))) + + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))) + + value(nilListValue + element + value("content") + value(i1))) + + value(nilListValue + element + value("entry") + + value(nilListValue + element + value("title") + value(string("item"))) + + value(nilListValue + element + value("id") + value(string("cart-53d67a61-aa5e-4e5e-8401-39edeba8b83c"))) + + value(nilListValue + element + value("author") + value(string("jane@example.com"))) + + value(nilListValue + element + value("updated") + value(string("Fri Jan 01 08:11:36 PDT 2012"))) + + value(nilListValue + element + value("content") + value(i2))); - const list a = list() + (append(list() + element + value("feed") - + value(list() + element + value("title") + value(string("Feed"))) - + value(list() + element + value("id") + value("1234")), + const list a = nilListValue + (append(nilListValue + element + value("feed") + + value(nilListValue + element + value("title") + value(string("Feed"))) + + value(nilListValue + element + value("id") + value("1234")), i)); ostringstream os; @@ -273,7 +273,7 @@ bool testFeed() { } int main() { - tuscany::gc_scoped_pool p; + const tuscany::gc_scoped_pool p; tuscany::cout << "Testing..." << tuscany::endl; tuscany::atom::testEntry(); diff --git a/sca-cpp/trunk/modules/atom/atom.hpp b/sca-cpp/trunk/modules/atom/atom.hpp index 5de3894214..2f6e688bcb 100644 --- a/sca-cpp/trunk/modules/atom/atom.hpp +++ b/sca-cpp/trunk/modules/atom/atom.hpp @@ -30,7 +30,7 @@ #include "list.hpp" #include "value.hpp" #include "monad.hpp" -#include "xml.hpp" +#include "../xml/xml.hpp" namespace tuscany { namespace atom { @@ -46,24 +46,24 @@ const value entry("entry"); */ const list entryElementValues(const list& e) { const list lt = filter(selector(mklist(element, "title")), e); - const list t = list() + element + value("title") + (isNil(lt)? value(emptyString) : elementValue(car(lt))); + const list t = nilListValue + element + value("title") + (isNil(lt)? value(emptyString) : elementValue(car(lt))); const list li = filter(selector(mklist(element, "id")), e); - const list i = list() + element + value("id") + (isNil(li)? value(emptyString) : elementValue(car(li))); + const list i = nilListValue + element + value("id") + (isNil(li)? value(emptyString) : elementValue(car(li))); const list la = filter(selector(mklist(element, "author")), e); - const list lan = isNil(la)? list() : filter(selector(mklist(element, "name")), car(la)); - const list lae = isNil(la)? list() : filter(selector(mklist(element, "email")), car(la)); + const list lan = isNil(la)? nilListValue : filter(selector(mklist(element, "name")), car(la)); + const list lae = isNil(la)? nilListValue : filter(selector(mklist(element, "email")), car(la)); const list laa = isNil(lan)? lae : lan; - const list a = isNil(laa)? list() : mklist(list() + element + value("author") + elementValue(car(laa))); + const list a = isNil(laa)? nilListValue : mklist(nilListValue + element + value("author") + elementValue(car(laa))); const list lu = filter(selector(mklist(element, "updated")), e); - const list u = isNil(lu)? list() : mklist(list() + element + value("updated") + elementValue(car(lu))); + const list u = isNil(lu)? nilListValue : mklist(nilListValue + element + value("updated") + elementValue(car(lu))); const list lc = filter(selector(mklist(element, "content")), e); - const list c = isNil(lc)? list() : mklist(list() + element + value("content") + elementValue(car(lc))); + const list c = isNil(lc)? nilListValue : mklist(nilListValue + element + value("content") + elementValue(car(lc))); - return append(append(append(list() + element + entry + value(t) + value(i), a), u), c); + return append(append(append(nilListValue + element + entry + value(t) + value(i), a), u), c); } /** @@ -79,7 +79,7 @@ const list entriesElementValues(const list& e) { * Return true if a list of strings contains an ATOM feed. */ const bool isATOMFeed(const list& ls) { - if (!isXML(ls)) + if (!xml::isXML(ls)) return false; return contains(car(ls), "& ls) { * Return true if a list of strings contains an ATOM entry. */ const bool isATOMEntry(const list& ls) { - if (!isXML(ls)) + if (!xml::isXML(ls)) return false; return contains(car(ls), "& ls) { * Convert a list of strings to a list of values representing an ATOM entry. */ const failable > readATOMEntry(const list& ilist) { - const list e = readXML(ilist); + const list e = content(xml::readElements(ilist)); if (isNil(e)) return mkfailure >("Empty entry"); return mklist(entryElementValues(car(e))); @@ -107,32 +107,25 @@ const failable > readATOMEntry(const list& ilist) { * Convert a list of strings to a list of values representing an ATOM feed. */ const failable > readATOMFeed(const list& ilist) { - const list f = readXML(ilist); + const list f = content(xml::readElements(ilist)); if (isNil(f)) return mkfailure >("Empty feed"); const list t = filter(selector(mklist(element, "title")), car(f)); const list i = filter(selector(mklist(element, "id")), car(f)); const list e = filter(selector(mklist(element, entry)), car(f)); - return mklist(append(list() + element + feed - + value(list() + element + value("title") + elementValue(car(t))) - + value(list() + element + value("id") + elementValue(car(i))), + return mklist(append(nilListValue + element + feed + + value(nilListValue + element + value("title") + elementValue(car(t))) + + value(nilListValue + element + value("id") + elementValue(car(i))), entriesElementValues(e))); } /** * Returns children of an ATOM content element. */ -struct filterContentElementChildren { - const value type; - filterContentElementChildren() : type("type") { - } - const bool operator()(const value& v) const { - return !(isAttribute(v) && attributeName((list)v) == type); - } -}; - const list contentElementChildren(const value& content) { - return filter(filterContentElementChildren(), elementChildren(content)); + return filter([](const value& v) { + return !(isAttribute(v) && attributeName((list)v) == "type"); + }, elementChildren(content)); } /** @@ -146,18 +139,18 @@ const list entryElement(const list& l) { const value updated = elementChild("updated", l); const value content = elementChild("content", l); const bool text = isNil(content)? false : elementHasValue(content); - return list() - + element + entry + (list() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") - + (list() + element + "title" + (list() + attribute + "type" + "text") + elementValue(title)) - + (list() + element + "id" + elementValue(id)) - + (isNil(author)? list() : (list() + element + "author" + - (email? (list() + element + "email" + elementValue(author)) : (list() + element + "name" + elementValue(author))))) - + (isNil(updated)? list() : (list() + element + "updated" + elementValue(updated))) + return nilListValue + + element + entry + (nilListValue + attribute + "xmlns" + "http://www.w3.org/2005/Atom") + + (nilListValue + element + "title" + (nilListValue + attribute + "type" + "text") + elementValue(title)) + + (nilListValue + element + "id" + elementValue(id)) + + (isNil(author)? nilListValue : (nilListValue + element + "author" + + (email? (nilListValue + element + "email" + elementValue(author)) : (nilListValue + element + "name" + elementValue(author))))) + + (isNil(updated)? nilListValue : (nilListValue + element + "updated" + elementValue(updated))) + (isNil(content)? - list() : - append(list() + element + "content" + (list() + attribute + "type" + (text? "text" : "application/xml")), + nilListValue : + append(nilListValue + element + "content" + (nilListValue + attribute + "type" + (text? "text" : "application/xml")), text? mklist(elementValue(content)) : contentElementChildren(content))) - + (list() + element + "link" + (list() + attribute + "href" + elementValue(id))); + + (nilListValue + element + "link" + (nilListValue + attribute + "href" + elementValue(id))); } /** @@ -172,9 +165,9 @@ const list entriesElements(const list& l) { /** * Convert a list of element values representing an ATOM entry to an ATOM entry. */ -template const failable writeATOMEntry(const lambda& reduce, const R& initial, const list& ll) { +template const failable writeATOMEntry(const lambda& reduce, const R& initial, const list& ll) { const list l = isNil(ll)? ll : (list)car(ll); - return writeXML(reduce, initial, mklist(entryElement(l))); + return xml::writeElements(reduce, initial, mklist(entryElement(l))); } const failable > writeATOMEntry(const list& l) { @@ -187,31 +180,31 @@ const failable > writeATOMEntry(const list& l) { /** * Convert a list of element values representing an ATOM feed to an ATOM feed. */ -template const failable writeATOMFeed(const lambda& reduce, const R& initial, const list& ll) { +template const failable writeATOMFeed(const lambda& reduce, const R& initial, const list& ll) { const list l = isNil(ll)? ll : (list)car(ll); const list lt = filter(selector(mklist(element, "title")), l); const value t = isNil(lt)? value(emptyString) : elementValue(car(lt)); const list li = filter(selector(mklist(element, "id")), l); const value i = isNil(li)? value(emptyString) : elementValue(car(li)); - const list f = list() - + element + feed + (list() + attribute + "xmlns" + "http://www.w3.org/2005/Atom") - + (list() + element + "title" + (list() + attribute + "type" + "text") + t) - + (list() + element + "id" + i); + const list f = nilListValue + + element + feed + (nilListValue + attribute + "xmlns" + "http://www.w3.org/2005/Atom") + + (nilListValue + element + "title" + (nilListValue + attribute + "type" + "text") + t) + + (nilListValue + element + "id" + i); // Write ATOM entries const list le = filter(selector(mklist(element, entry)), l); if (isNil(le)) - return writeXML(reduce, initial, mklist(f)); + return xml::writeElements(reduce, initial, mklist(f)); // Write a single ATOM entry element with a list of values if (!isNil(le) && !isNil(car(le)) && isList(car(caddr(car(le))))) { const list fe = append(f, entriesElements(caddr(car(le)))); - return writeXML(reduce, initial, mklist(fe)); + return xml::writeElements(reduce, initial, mklist(fe)); } // Write separate ATOM entry elements const list fe = append(f, entriesElements(le)); - return writeXML(reduce, initial, mklist(fe)); + return xml::writeElements(reduce, initial, mklist(fe)); } /** -- cgit v1.2.3