[Saga-devel] saga SVN commit 3395: /trunk/saga/impl/engine/
hkaiser at cct.lsu.edu
hkaiser at cct.lsu.edu
Tue Jan 27 10:13:19 CST 2009
User: hkaiser
Date: 2009/01/27 10:13 AM
Modified:
/trunk/saga/impl/engine/
session.cpp, session.hpp
Log:
Added possibility to use vector attributes for the proto-context initialization.
Context objects now have extensible attribute set.
File Changes:
Directory: /trunk/saga/impl/engine/
===================================
File [modified]: session.cpp
Delta lines: +73 -15
===================================================================
--- trunk/saga/impl/engine/session.cpp 2009-01-26 13:32:30 UTC (rev 3394)
+++ trunk/saga/impl/engine/session.cpp 2009-01-27 16:13:17 UTC (rev 3395)
@@ -16,6 +16,13 @@
///////////////////////////////////////////////////////////////////////////
struct base_context_list
{
+ typedef
+ std::vector<std::pair<std::string, std::string> >
+ proto_context_type;
+ typedef
+ std::vector<std::pair<std::string, std::vector<std::string> > >
+ vector_proto_context_type;
+
base_context_list(saga::impl::session const* s)
: session_(s)
{}
@@ -39,11 +46,16 @@
SAGA_THROW_VERBATIM(session_, "Not implemented", saga::NotImplemented);
}
virtual void
- add_proto_context(
- std::vector<std::pair<std::string, std::string> > const& entries)
+ add_proto_context(proto_context_type const& entries)
{
SAGA_THROW_VERBATIM(session_, "Not implemented", saga::NotImplemented);
}
+ virtual void
+ add_proto_context(proto_context_type const& entries,
+ vector_proto_context_type const& vector_entries)
+ {
+ SAGA_THROW_VERBATIM(session_, "Not implemented", saga::NotImplemented);
+ }
saga::impl::session const* session_;
};
@@ -63,14 +75,22 @@
}
// make a temporary copy of the keys and values
- void add_proto_context(
- std::vector<std::pair<std::string, std::string> > const& entries)
+ void add_proto_context(proto_context_type const& entries)
{
entries_.push_back(entries);
+ vector_entries_.push_back(vector_proto_context_type());
}
- typedef std::vector<std::pair<std::string, std::string> > proto_context_type;
+ // make a temporary copy of the keys and values
+ void add_proto_context(proto_context_type const& entries,
+ vector_proto_context_type const& vector_entries)
+ {
+ entries_.push_back(entries);
+ vector_entries_.push_back(vector_entries);
+ }
+
std::vector<proto_context_type> entries_;
+ std::vector<vector_proto_context_type> vector_entries_;
};
///////////////////////////////////////////////////////////////////////////
@@ -93,11 +113,13 @@
{
saga::context c;
try {
+ // add non-vector attributes
std::vector<std::pair<std::string, std::string> >& entries =
protolist->entries_[i];
bool has_type = false;
- for (std::size_t k = 0; k < entries.size(); ++k) {
+ for (std::size_t k = 0; k < entries.size(); ++k)
+ {
if (entries[k].first == saga::attributes::context_type)
has_type = true;
@@ -108,6 +130,16 @@
"List of attribute keys does not contain the context's "
"'type'", saga::BadParameter);
}
+
+ // add vector_attributes
+ vector_proto_context_type& vector_entries =
+ protolist->vector_entries_[i];
+ for (std::size_t v = 0; v < vector_entries.size(); ++v)
+ {
+ c.set_vector_attribute(vector_entries[v].first,
+ vector_entries[v].second);
+ }
+
c.set_defaults();
}
catch (saga::exception const&) {
@@ -181,10 +213,14 @@
std::vector<saga::context> session::list_contexts() const
{
mutex_type::scoped_lock lock(mtx_);
- if (NULL == contexts_)
+ if (NULL == contexts_) {
contexts_ = new context_list(this);
- else if (contexts_->is_proto_context())
+ }
+ else if (contexts_->is_proto_context()) {
+ base_context_list* oldctxs = contexts_;
contexts_ = new context_list(this, (proto_context_list*)contexts_);
+ delete oldctxs;
+ }
return ((context_list*)contexts_)->contexts_; // make a copy
}
@@ -197,10 +233,14 @@
{
// create context list if needed
mutex_type::scoped_lock lock(mtx_);
- if (NULL == contexts_)
- contexts_ = new context_list(this);
- else if (contexts_->is_proto_context())
- contexts_ = new context_list(this, (proto_context_list*)contexts_);
+ if (NULL == contexts_) {
+ contexts_ = new context_list(this);
+ }
+ else if (contexts_->is_proto_context()) {
+ base_context_list* oldctxs = contexts_;
+ contexts_ = new context_list(this, (proto_context_list*)contexts_);
+ delete oldctxs;
+ }
// can we keep defaults?
if ( use_defaults )
@@ -226,8 +266,8 @@
void session::add_context (saga::context const& c)
{
- // add context, but do not keep defaults
- add_context (c, false);
+ // add context, but do not keep defaults
+ add_context (c, false);
}
void session::remove_context (saga::context const& c)
@@ -237,8 +277,11 @@
SAGA_THROW("remove_context: context does not exist",
saga::DoesNotExist);
}
- else if (contexts_->is_proto_context())
+ else if (contexts_->is_proto_context()) {
+ base_context_list* oldctxs = contexts_;
contexts_ = new context_list(this, (proto_context_list*)contexts_);
+ delete oldctxs;
+ }
contexts_->remove_context(c);
}
@@ -257,6 +300,21 @@
contexts_->add_proto_context(entries);
}
+ void session::add_proto_context (
+ std::vector<std::pair<std::string, std::string> > const& entries,
+ std::vector<std::pair<std::string, std::vector<std::string> > > const& vector_entries)
+ {
+ if (NULL == contexts_)
+ contexts_ = new proto_context_list(this);
+
+ if (!contexts_->is_proto_context()) {
+ SAGA_THROW("Out of order execution of 'add_proto_context'. This "
+ "should be called during adaptor construction only.",
+ saga::NoSuccess);
+ }
+ contexts_->add_proto_context(entries, vector_entries);
+ }
+
void session::release_contexts()
{
mutex_type::scoped_lock lock(mtx_);
File [modified]: session.hpp
Delta lines: +4 -0
===================================================================
--- trunk/saga/impl/engine/session.hpp 2009-01-26 13:32:30 UTC (rev 3394)
+++ trunk/saga/impl/engine/session.hpp 2009-01-27 16:13:17 UTC (rev 3395)
@@ -107,6 +107,10 @@
SAGA_EXPORT void add_proto_context (
std::vector<std::pair<std::string, std::string> > const& entries);
+ SAGA_EXPORT void add_proto_context (
+ std::vector<std::pair<std::string, std::string> > const& entries,
+ std::vector<std::pair<std::string, std::vector<std::string> > > const& vector_entries);
+
/**
* Returns the context attached to the session
*
More information about the saga-devel
mailing list