summaryrefslogtreecommitdiffstats
path: root/sca-cpp/trunk/kernel/element.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'sca-cpp/trunk/kernel/element.hpp')
-rw-r--r--sca-cpp/trunk/kernel/element.hpp103
1 files changed, 41 insertions, 62 deletions
diff --git a/sca-cpp/trunk/kernel/element.hpp b/sca-cpp/trunk/kernel/element.hpp
index 27b5af8691..9ae1e632cb 100644
--- a/sca-cpp/trunk/kernel/element.hpp
+++ b/sca-cpp/trunk/kernel/element.hpp
@@ -42,7 +42,7 @@ const string atsign("@");
/**
* Returns true if a value is an element.
*/
-bool isElement(const value& v) {
+inline const bool isElement(const value& v) {
if (!isList(v) || isNil(v) || element != car<value>(v))
return false;
return true;
@@ -51,7 +51,7 @@ bool isElement(const value& v) {
/**
* Returns true if a value is an attribute.
*/
-bool isAttribute(const value& v) {
+inline const bool isAttribute(const value& v) {
if (!isList(v) || isNil(v) || attribute != car<value>(v))
return false;
return true;
@@ -60,42 +60,42 @@ bool isAttribute(const value& v) {
/**
* Returns the name of an attribute.
*/
-const value attributeName(const list<value>& l) {
+inline const value attributeName(const list<value>& l) {
return cadr(l);
}
/**
* Returns the value of an attribute.
*/
-const value attributeValue(const list<value>& l) {
+inline const value attributeValue(const list<value>& l) {
return caddr(l);
}
/**
* Returns the name of an element.
*/
-const value elementName(const list<value>& l) {
+inline const value elementName(const list<value>& l) {
return cadr(l);
}
/**
* Returns true if an element has children.
*/
-const bool elementHasChildren(const list<value>& l) {
+inline const bool elementHasChildren(const list<value>& l) {
return !isNil(cddr(l));
}
/**
* Returns the children of an element.
*/
-const list<value> elementChildren(const list<value>& l) {
+inline const list<value> elementChildren(const list<value>& l) {
return cddr(l);
}
/**
* Returns true if an element has a value.
*/
-const bool elementHasValue(const list<value>& l) {
+inline const bool elementHasValue(const list<value>& l) {
const list<value> r = reverse(l);
if (isSymbol(car(r)))
return false;
@@ -107,26 +107,26 @@ const bool elementHasValue(const list<value>& l) {
/**
* Returns the value of an element.
*/
-const value elementValue(const list<value>& l) {
+inline const value elementValue(const list<value>& l) {
return car(reverse(l));
}
/**
* Convert an element to a value.
*/
-const bool elementToValueIsList(const value& v) {
+inline const bool elementToValueIsList(const value& v) {
if (!isList(v))
return false;
const list<value> l = v;
return (isNil(l) || !isSymbol(car(l)));
}
-const value elementToValue(const value& t) {
+inline const value elementToValue(const value& t) {
const list<value> elementsToValues(const list<value>& e);
// Convert an attribute
if (isTaggedList(t, attribute))
- return mklist<value>(c_str(atsign + attributeName(t)), attributeValue(t));
+ return mklist<value>(c_str(atsign + (string)attributeName(t)), attributeValue(t));
// Convert an element
if (isTaggedList(t, element)) {
@@ -155,7 +155,7 @@ const value elementToValue(const value& t) {
/**
* Convert a list of elements to a list of values.
*/
-const bool elementToValueIsSymbol(const value& v) {
+inline const bool elementToValueIsSymbol(const value& v) {
if (!isList(v))
return false;
const list<value> l = v;
@@ -166,7 +166,7 @@ const bool elementToValueIsSymbol(const value& v) {
return true;
}
-const list<value> elementToValueGroupValues(const value& v, const list<value>& l) {
+inline const list<value> elementToValueGroupValues(const value& v, const list<value>& l) {
if (isNil(l) || !elementToValueIsSymbol(v) || !elementToValueIsSymbol(car(l)))
return cons(v, l);
if (car<value>(car(l)) != car<value>(v))
@@ -180,7 +180,7 @@ const list<value> elementToValueGroupValues(const value& v, const list<value>& l
}
-const list<value> elementsToValues(const list<value>& e) {
+inline const list<value> elementsToValues(const list<value>& e) {
if (isNil(e))
return e;
return elementToValueGroupValues(elementToValue(car(e)), elementsToValues(cdr(e)));
@@ -189,13 +189,13 @@ const list<value> elementsToValues(const list<value>& e) {
/**
* Convert a value to an element.
*/
-const value valueToElement(const value& t) {
+inline const value valueToElement(const value& t) {
const list<value> valuesToElements(const list<value>& l);
// Convert a name value pair
if (isList(t) && !isNil((list<value>)t) && isSymbol(car<value>(t))) {
const value n = car<value>(t);
- const value v = isNil(cdr<value>(t))? value() : cadr<value>(t);
+ const value v = isNil(cdr<value>(t))? nilValue : cadr<value>(t);
// Convert a single value to an attribute or an element
if (!isList(v)) {
@@ -221,7 +221,7 @@ const value valueToElement(const value& t) {
/**
* Convert a list of values to a list of elements.
*/
-const list<value> valuesToElements(const list<value>& l) {
+inline const list<value> valuesToElements(const list<value>& l) {
if (isNil(l))
return l;
return cons<value>(valueToElement(car(l)), valuesToElements(cdr(l)));
@@ -231,72 +231,51 @@ const list<value> valuesToElements(const list<value>& l) {
* Returns a selector lambda function which can be used to filter
* elements against the given element pattern.
*/
-struct selectorLambda {
- const list<value> select;
- selectorLambda(const list<value>& s) : select(s) {
- }
- const bool evalSelect(const list<value>& s, const list<value> v) const {
- if (isNil(s))
- return true;
- if (isNil(v))
- return false;
- if (car(s) != car(v))
- return false;
- return evalSelect(cdr(s), cdr(v));
- }
- const bool operator()(const value& v) const {
+inline const lambda<const bool(const value&)> selector(const list<value>& select) {
+ return [select](const value& v) -> const bool {
+ const lambda<const bool(const list<value>&, const list<value>&)> evalSelect = [&evalSelect](const list<value>& s, const list<value>& v) -> const bool {
+ if (isNil(s))
+ return true;
+ if (isNil(v))
+ return false;
+ if (car(s) != car(v))
+ return false;
+ return evalSelect(cdr(s), cdr(v));
+ };
if (!isList(v))
return false;
return evalSelect(select, v);
- }
-};
-
-const lambda<bool(const value&)> selector(const list<value> s) {
- return selectorLambda(s);
+ };
}
/**
* Returns the value of the attribute with the given name.
*/
-struct filterAttribute {
- const value name;
- filterAttribute(const value& n) : name(n) {
- }
- const bool operator()(const value& v) const {
- return isAttribute(v) && attributeName((list<value>)v) == name;
- }
-};
-
-const value attributeValue(const value& name, const value& l) {
- const list<value> f = filter<value>(filterAttribute(name), list<value>(l));
+inline const value attributeValue(const value& name, const value& l) {
+ const list<value> f = filter<value>([name](const value& v) {
+ return isAttribute(v) && attributeName((list<value>)v) == name;
+ }, list<value>(l));
if (isNil(f))
- return value();
+ return nilValue;
return caddr<value>(car(f));
}
/**
* Returns child elements with the given name.
*/
-struct filterElement {
- const value name;
- filterElement(const value& n) : name(n) {
- }
- const bool operator()(const value& v) const {
- return isElement(v) && elementName((list<value>)v) == name;
- }
-};
-
-const value elementChildren(const value& name, const value& l) {
- return filter<value>(filterElement(name), list<value>(l));
+inline const value elementChildren(const value& name, const value& l) {
+ return filter<value>([name](const value& v) {
+ return isElement(v) && elementName((list<value>)v) == name;
+ }, list<value>(l));
}
/**
* Return the child element with the given name.
*/
-const value elementChild(const value& name, const value& l) {
+inline const value elementChild(const value& name, const value& l) {
const list<value> f = elementChildren(name, l);
if (isNil(f))
- return value();
+ return nilValue;
return car(f);
}