summaryrefslogtreecommitdiffstats
path: root/cpp/sca/runtime/core/src/tuscany/function.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'cpp/sca/runtime/core/src/tuscany/function.hpp')
-rw-r--r--cpp/sca/runtime/core/src/tuscany/function.hpp51
1 files changed, 24 insertions, 27 deletions
diff --git a/cpp/sca/runtime/core/src/tuscany/function.hpp b/cpp/sca/runtime/core/src/tuscany/function.hpp
index e0e8889dad..caba5211b9 100644
--- a/cpp/sca/runtime/core/src/tuscany/function.hpp
+++ b/cpp/sca/runtime/core/src/tuscany/function.hpp
@@ -23,14 +23,12 @@
#define tuscany_function_hpp
/**
- * Lambda function type, used to represent service operations.
+ * Lambda function type.
*/
#include <iostream>
#include "gc.hpp"
-using std::ostream;
-
namespace tuscany {
/**
@@ -50,15 +48,13 @@ bool resetLambdaCounters() {
}
bool printLambdaCounters() {
- using std::cout;
- using std::endl;
- cout << "countLambdas " << countLambdas << endl;
- cout << "countELambdas " << countELambdas << endl;
- cout << "countFLambdas " << countFLambdas << endl;
- cout << "countCLambdas " << countCLambdas << endl;
- cout << "countProxies " << countProxies << endl;
- cout << "countFProxies " << countFProxies << endl;
- cout << "countCProxies " << countCProxies << endl;
+ std::cout << "countLambdas " << countLambdas << std::endl;
+ std::cout << "countELambdas " << countELambdas << std::endl;
+ std::cout << "countFLambdas " << countFLambdas << std::endl;
+ std::cout << "countCLambdas " << countCLambdas << std::endl;
+ std::cout << "countProxies " << countProxies << std::endl;
+ std::cout << "countFProxies " << countFProxies << std::endl;
+ std::cout << "countCProxies " << countCProxies << std::endl;
return true;
}
@@ -81,11 +77,11 @@ public:
}
unsigned int acquire() {
- return ++refCount;
+ return __sync_add_and_fetch(&refCount, 1);
}
unsigned int release() {
- return --refCount;
+ return __sync_sub_and_fetch(&refCount, 1);
}
template<typename F> class Proxy: public Callable {
@@ -95,7 +91,7 @@ public:
countFProxies ++;
}
- Proxy(const Proxy& p) : function(p.function) {
+ explicit Proxy(const Proxy& p) : function(p.function) {
countProxies++;
countCProxies ++;
}
@@ -166,14 +162,14 @@ public:
return (*callable)(std::forward<P>(p)...);
}
- template<typename S> friend ostream& operator<<(ostream&, const lambda<S>&);
+ template<typename S> friend std::ostream& operator<<(std::ostream&, const lambda<S>&);
private:
typedef Callable<R,P...> CallableType;
gc_counting_ptr<CallableType> callable;
};
-template<typename S> ostream& operator<<(ostream& out, const lambda<S>& l) {
+template<typename S> std::ostream& operator<<(std::ostream& out, const lambda<S>& l) {
return out << "lambda::" << l.callable;
}
@@ -187,23 +183,22 @@ template<typename R, typename... P> lambda<R(P...)> makeLambda(const R (* const
/**
* Curry a lambda function.
*/
-template<typename R, typename T, typename... P> class Curried {
-private:
- const T v;
- const lambda<R(T, P...)>f;
-
+template<typename R, typename T, typename... P> class curried {
public:
- Curried(const lambda<R(T, P...)>& f, const T& v): v(v), f(f) {
+ curried(const lambda<R(T, P...)>& f, const T& v): v(v), f(f) {
}
const R operator()(P... p) const {
return f(v, std::forward<P>(p)...);
}
+private:
+ const T v;
+ const lambda<R(T, P...)>f;
};
template<typename R, typename T, typename... P> const lambda<R(P...)> curry(const lambda<R(T, P...)>& f, const T& t) {
- return (lambda<R(P...)>)Curried<R, T, P...>(f, t);
+ return (lambda<R(P...)>)curried<R, T, P...>(f, t);
}
template<typename R, typename T, typename U, typename... P> const lambda<R(P...)> curry(const lambda<R(T, U, P...)>& f, const T& t, const U& u) {
@@ -217,14 +212,16 @@ template<typename R, typename T, typename U, typename V, typename... P> const la
/**
* A lambda function that returns the given value.
*/
-template<typename T> struct unitReturn {
- const T v;
- unitReturn(const T& v) :
+template<typename T> class unitReturn {
+public:
+ explicit unitReturn(const T& v) :
v(v) {
}
const T operator()() const {
return v;
}
+private:
+ const T v;
};
template<typename T> const lambda<T()> unit(const T& v) {