summaryrefslogtreecommitdiff
path: root/trunk/TAO/tao/PortableServer/Key_Adapters.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'trunk/TAO/tao/PortableServer/Key_Adapters.cpp')
-rw-r--r--trunk/TAO/tao/PortableServer/Key_Adapters.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/trunk/TAO/tao/PortableServer/Key_Adapters.cpp b/trunk/TAO/tao/PortableServer/Key_Adapters.cpp
new file mode 100644
index 00000000000..9263e4470fc
--- /dev/null
+++ b/trunk/TAO/tao/PortableServer/Key_Adapters.cpp
@@ -0,0 +1,152 @@
+// $Id$
+
+#include "tao/PortableServer/Key_Adapters.h"
+
+#include "ace/ACE.h"
+#include "ace/OS_NS_string.h"
+#include "ace/Map_T.h"
+
+ACE_RCSID (PortableServer,
+ Key_Adapters,
+ "$Id$")
+
+///////////////////////////////////////////////////////////////////////////////
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+TAO_Incremental_Key_Generator::TAO_Incremental_Key_Generator (void)
+ : counter_ (0)
+{
+}
+
+int
+TAO_Incremental_Key_Generator::operator() (PortableServer::ObjectId &id)
+{
+ // Resize to accommodate the counter.
+ id.length (sizeof this->counter_);
+
+ // Add new key data.
+ ACE_OS::memcpy (id.get_buffer (),
+ &++this->counter_,
+ sizeof this->counter_);
+
+ // Success.
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+u_long
+TAO_ObjectId_Hash::operator () (const PortableServer::ObjectId &id) const
+{
+ return ACE::hash_pjw ((const char *) id.get_buffer (),
+ id.length ());
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+int
+TAO_Ignore_Original_Key_Adapter::encode (const PortableServer::ObjectId &original_key,
+ const ACE_Active_Map_Manager_Key &active_key,
+ PortableServer::ObjectId &modified_key)
+{
+ ACE_UNUSED_ARG (original_key);
+
+ // Size of active key.
+ size_t active_key_size = active_key.size ();
+
+ // Resize to accommodate both the original data and the new active key.
+ modified_key.length (static_cast <CORBA::ULong> (active_key_size));
+
+ // Copy active key data into user key.
+ active_key.encode (modified_key.get_buffer ());
+
+ // Success.
+ return 0;
+}
+
+int
+TAO_Ignore_Original_Key_Adapter::decode (const PortableServer::ObjectId &modified_key,
+ ACE_Active_Map_Manager_Key &active_key)
+{
+ // Read off value of index and generation.
+ active_key.decode (modified_key.get_buffer ());
+
+ // Success.
+ return 0;
+}
+
+int
+TAO_Ignore_Original_Key_Adapter::decode (const PortableServer::ObjectId &modified_key,
+ PortableServer::ObjectId &original_key)
+{
+ // Smartly copy all the data; <original_key does not own the data>.
+ original_key.replace (modified_key.maximum (),
+ modified_key.length (),
+ const_cast <CORBA::Octet *>
+ (modified_key.get_buffer ()),
+ 0);
+
+ // Success.
+ return 0;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+
+int
+TAO_Preserve_Original_Key_Adapter::encode (const PortableServer::ObjectId &original_key,
+ const ACE_Active_Map_Manager_Key &active_key,
+ PortableServer::ObjectId &modified_key)
+{
+ // Size of active key.
+ size_t active_key_size = active_key.size ();
+
+ // Resize to accommodate both the original data and the new active key.
+ modified_key.length (static_cast <CORBA::ULong> (active_key_size)
+ + original_key.length ());
+
+ // Copy active key data into user key.
+ active_key.encode (modified_key.get_buffer ());
+
+ // Copy the original key after the active key.
+ ACE_OS::memcpy (modified_key.get_buffer () + active_key_size,
+ original_key.get_buffer (),
+ original_key.length ());
+
+ // Success.
+ return 0;
+}
+
+int
+TAO_Preserve_Original_Key_Adapter::decode (const PortableServer::ObjectId &modified_key,
+ ACE_Active_Map_Manager_Key &active_key)
+{
+ // Read off value of index and generation.
+ active_key.decode (modified_key.get_buffer ());
+
+ // Success.
+ return 0;
+}
+
+int
+TAO_Preserve_Original_Key_Adapter::decode (const PortableServer::ObjectId &modified_key,
+ PortableServer::ObjectId &original_key)
+{
+ // Size of active key.
+ size_t active_key_size = ACE_Active_Map_Manager_Key::size ();
+
+ // Smartly copy all the data; <original_key does not own the data>.
+ original_key.replace (static_cast <CORBA::ULong>
+ (modified_key.maximum () - active_key_size),
+ static_cast <CORBA::ULong>
+ (modified_key.length () - active_key_size),
+ const_cast <CORBA::Octet *>
+ (modified_key.get_buffer ()) + active_key_size,
+ 0);
+
+ // Success.
+ return 0;
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+