Ebenezer Enterprises

We host a free code generator called the the C++ Middleware Writer (CMW). The CMW writes low-level C++ marshalling code based on user input.

Using the CMW in your build environment
Comparing Boost Serialization to our approach
Send Sample - sendsample.cc
Receive Sample - receivesample.cc
Rbtree Sample

Supported Types and Platforms
Provide Feedback
Company Overview
Links

Recent Developments

September, 2011

Version 1.13 of the CMW is on line. This version adds support for move semantics. The following shows an example of generated code that uses std::move.


template 
void
Receive (::cmw::ReceiveBufferTCP& buf
         , std::vector >& az1
        )
{
  uint32_t headCount[2];
  buf.Give(headCount[0]);
  az1.reserve(az1.size() + headCount[0]);
  for (; headCount[0] > 0; --headCount[0]) {
    std::deque rep2;
    buf.Give(headCount[1]);
    for (; headCount[1] > 0; --headCount[1]) {
      std::string rep3;
      stringReceive(buf, rep3);
      rep2.push_back(::std::move(rep3));
    }
    az1.push_back(::std::move(rep2));
  }
}
October, 2010

Version 1.12 of the C++ Middleware Writer released.

April, 2010

Version 1.11 of the C++ Middleware Writer released.

November, 2009

Version 1.10 of the C++ Middleware Writer released.

August, 2009

Support for stable_vector added. Here's a modified version of stable_vector.hpp that compiles with gcc version 4.3.2.

May, 2009

Support for Boost Array is available.

July, 2009

February, 2009

March, 2008

Support for the Boost Unordered Containers library is available. This includes unordered_set, unordered_multiset, unordered_map and unordered_multimap.

Support for message lengths is now available. Code that receives messages should call SetMsgLength() (ReceiveBuffer::SetMsgLength or ReceiveCompressedBuffer::SetMsgLength) prior to calling a Receive function. See the Receive Sample for an example of this. A clc++m thread titled "Preventing Denial of Service Attack in IPC Serialization" was instrumental in the decision to add this support.

Support for the Boost Range library's sub_range<> is available. The support for this type is unusual in that it is possible to send data via a sub_range but not receive data into one. There's more info here about how we support this type.

January, 2008

Support for message IDs is now available.
This Middle code:

msgs
  @msg_id_a1 @out (list<int32_t>) 
}

results in this output. Notice how the Marshal function includes code to send a message ID, but the Receive function doesn't have any related code. The data from the Marshal function will probably be handled by two Receive functions. The first Receive function (not shown) to execute will get a message ID, which can then be used to dispatch to the Receive function in the above listing. This program shows an example of that.

June, 2006

Worked on improving the Middleware Service documentation including expanding the "Advantages" section and adding a section called "Dealing with Stragglers" that discusses supporting multiple versions of a product simultaneosly.

December, 2005

Added valarray<> support,
changed/improved the code generated when receiving vectors of POD,
changed/improved the code in Marshal functions after noting only a single int is needed to keep track of the counts/sizes of container classes. We still use an array of ints in Receive functions.