    <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/">
     <channel>
        <title>ACCU  :: copy_on_write_ptr&lt;type&gt;</title>
        <link>https://members.accu.org/index.php/articles/563</link>
        <description>Professionalism in Programming</description>
        <dc:language>en-us</dc:language> 
        <dc:creator>Administrator</dc:creator> 
        <admin:generatorAgent rdf:resource="http://www.xaraya.org" /> 
        <admin:errorReportsTo rdf:resource="mailto:webeditor@accu.org" />
       <sy:updatePeriod>hourly</sy:updatePeriod>
       <sy:updateFrequency>1</sy:updateFrequency>
       <docs>http://backend.userland.com/rss</docs>




<div class="xar-mod-head"><span class="xar-mod-title">Programming Topics + Overload Journal #31 - Apr 1999</span></div>

<table border="0" cellpadding="1" cellspacing="0">
    <tbody>
    <tr>
        <td valign="top">
            Browse in :
       </td>
       <td valign="top">

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c13/">Topics</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c65/">Programming</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/">All</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c76/">Journals</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c78/">Overload</a>

                     &gt;                         <a href="https://members.accu.org/index.php/articles/c173/">31</a>
<br />

                                            <a href="https://members.accu.org/index.php/articles/c65-173/">Any of these categories</a>

                    -                        <a href="https://members.accu.org/index.php/articles/c65+173/">All of these categories</a>
<br />
</td>
   </tr>
   </tbody>
</table>




<div class="xar-error">
   <p>
 <strong>Note:</strong> when you create a new publication type,
the articles module will automatically use the templates
<em>user-display-[publicationtype].xt</em>
and <em>user-summary-[publicationtype].xt</em>.
If those templates do not exist when you try to preview or display a new article,
you'll get this warning :-)  Please place your own templates in themes/<em>yourtheme</em>/modules/articles . The templates will get the extension .xt there. </p>
</div>
<div class="xar-norm xar-standard-box-padding">
   <h1><strong>Title:</strong>&nbsp;copy_on_write_ptr&lt;type&gt;</h1>
<p><strong>Author:</strong>&nbsp;</p>
<p>
<strong>Date:</strong> 26 April 1999 17:50:52 +01:00 or Mon, 26 April 1999 17:50:52 +01:00</p>
<p><strong>Summary:</strong>&nbsp;</p>
<p><strong>Body:</strong>&nbsp;<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e18" id="d0e18"></a>Recap</h2>
</div>
<p>In my first counted_ptr&lt;&gt; article (way back now) I created
a flawed string class that reference counted shared state. The flaw
in this deliberately na&iuml;ve attempt was that it failed to
consider an important question: what happens when you change shared
state? For my fledgling string class it was an internal
implementation detail. This meant the string modifier-methods had
to create a personal, unshared copy of the state before doing their
modification. My second counted_ptr&lt;&gt; article focused on just
<span class="emphasis"><em>one</em></span> of the string
modifier-methods; the subscript operator. At the end of the second
article the string class looked like this</p>
<pre class="programlisting">
namespace accu {
 class string {
 public: // types
  class char_reference;
  typedef char_reference reference;
  ... ... ...
 public: // access, idiomatic and primitive
  char_reference operator[](size_t index);
  char operator[](size_t index) const;

  void assign(size_t index, char new_value); 

 private: // plumbing
  void bounds_check(size_t index) const;
  void unshare_state();

 private: // representation
  char * text;
  size_t * count;
 };

 class string::char_reference {
 public:
  char_reference(string * target,
                 size_t index);
  ... ... ...
  char_reference operator=(char new_value)
  operator char() const;

 private:
  string * const target;
  size_t const index;
 };
}
</pre>
<p>The essence of the second article was that in a code fragment
like this</p>
<pre class="programlisting">
string theory(&quot;hello&quot;);
theory[0] = 'J';   // statement 1
cout &lt;&lt; theory[0]; // statement 2
</pre>
<p>statement 1 is syntactic shorthand for</p>
<pre class="programlisting">
string::char_reference __temp = theory[0];
__temp.operator=('J');// delegates to theory.assign(0, 'J')
</pre>
<p>and statement 2 is syntactic shorthand for</p>
<pre class="programlisting">
string::char_reference __temp1 = theory[0];
char __temp2 = __temp1.operator char();
cout &lt;&lt; __temp2;
</pre></div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e40" id="d0e40"></a>Caching in</h2>
</div>
<p>Suppose we want to cache the length of the string. We could
design the cache as, say, a <tt class="type">size_t</tt>. A cache
value of zero indicates a &quot;stale&quot; cache. The length query simply
refreshes a stale cache (if it needs to) by calling <tt class=
"function">strlen</tt>. The cache will need to be declared
<tt class="literal">mutable</tt>. All pretty standard stuff. But
hang on: the cache will need to be <tt class=
"literal">mutable</tt>? Will it? The text is shared, and the cache
value is the length of <tt class="varname">text</tt>, so shouldn't
the cache be shared too?</p>
<pre class="programlisting">
namespace accu {
 class string {
 public:
  string(const char * literal = &quot;&quot;);
  ... ... ...
  char_reference operator[](size_t index);
  void assign(size_t index, char new_value);
  size_t length() const;
  ... ... ...
 private:
  char * text;
  size_t * cached_length; // == strlen(text)
  size_t * count;
 };
}
</pre>
<p>The need for <tt class="literal">mutable</tt> vanishes because
const-ness does not traverse a pointer (I will return to this). The
<tt class="methodname">string::length()</tt> query cannot change
<tt class="varname">cached_length</tt> (which is a pointer), but it
can change what <tt class="varname">cached_length</tt> points to.
Hence we arrive at</p>
<pre class="programlisting">
namespace accu {

 size_t string::length() const {
  if (*cached_length == 0)
  {
    *cached_length = strlen(text);
  }
  return *cached_length;
 }
 ... ... ...
 void string::assign(size_t index,
                     char new_value) {
  bounds_check(index);
  unshare_state();
  text[index] = new_value;
  *cached_length = 0;
 }
}
</pre>
<p>This is fine as far as it goes, but it goes too far. It's doing
more work than it needs to. Consider the two cases. First, what if
<i class="parameter"><tt>new_value</tt></i> (of <tt class=
"methodname">assign</tt>) is not the null-character? Answer:
<tt class="varname">*cached_length</tt> is needlessly being reset.
That's easy to fix though.</p>
<pre class="programlisting">
namespace accu {
 void string::assign(size_t index,
                     char new_value)
 {
  bounds_check(index);
  unshare_state();
  text[index] = new_value;
  if (new_value == '\0')
  {
    *cached_length = 0;
  }
 }
}
</pre>
<p>Second, what if <i class="parameter"><tt>new_value</tt></i> (of
<tt class="methodname">assign</tt>) is the null-character? Answer:
<tt class="varname">*cached_length</tt> does (surely?) need to be
reset. Yes, but does it need to reset it to zero? Follow it
through; what will <tt class="methodname">string::length</tt>
recalculate the cache value as? Well, to <tt class=
"literal">strlen(text)</tt>. Yes, but what's that? Answer: the
value of index in the previous assign where <i class=
"parameter"><tt>new_value</tt></i> was the null-character!
Hence</p>
<pre class="programlisting">
namespace accu {
 size_t string::length() const
 {
  return *cached_length;
 }
 ... ... ...
 void string::assign(size_t index,
                     char new_value)
 {
  bounds_check(index);
  unshare_state();
  text[index] = new_value;
  if (new_value == '\0')
  {
    *cached_length = index;
  }
 }
}
</pre>
<p>Neat eh?</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e115" id="d0e115"></a>Putting the
counted_ptr&lt;&gt; back in again</h2>
</div>
<p>The string class is getting messy; at least two private methods
(not great on a user class) and three data members (if we leave the
cache in) that are all pointers. Time to simplify. Time to put the
<tt class="classname">counted_ptr&lt;&gt;</tt> back.</p>
<pre class="programlisting">
#include &quot;counted_ptr.hpp&quot;

namespace accu {

 class string {
 public:
  size_t length() const;
  ... ... ...
  void assign(size_t index, char new_value);
 private:
  void unshare_state();

 private:
  class body;
  counted_ptr&lt;body&gt; ptr;
 };
}
</pre>
<pre class="programlisting">
namespace accu {
 struct string::body {
  char * text; 
  size_t cached_length; // strlen(text)
  ... ... ...
  body(const char * literal);
  void assign(size_t index, char new_value);
  ... ... ...
 };
}
</pre></div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e127" id="d0e127"></a>Rethinking
public vs. private. Again</h2>
</div>
<p>You may recall in one of my articles I um'ed-and-ah'ed about the
pros and cons of making <tt class="methodname">string::assign</tt>
public or private. Making it private was attractive because it
meant there was a single syntax for assignment. It also shrank the
public interface a little. And a small public interface is a Good
Thing. Small things tend to be cohesive. Also, a mistake on a
private signature is going to affect user code a lot less than a
mistake on a public signature. In this case, there's real bite to
that advice. I was looking through the spec for <tt class=
"classname">std::string</tt> in my copy of the standard. I happened
to notice a method called, you've guessed it, <tt class=
"methodname">assign</tt> taking two parameters: a <tt class=
"type">size_t</tt> and a <tt class="type">char</tt>. And of course,
the semantics are completely different. Oops [1]. However, as is so
often the case with mistakes, this proved quite lucky. It forced me
to consider another option. One I hadn't even considered before:
remove the method altogether! The insight is that methods of
<tt class="methodname">string::char_reference</tt> don't have to
delegate to methods of string (which in turn delegate to methods of
<tt class="classname">string::body</tt>). They could delegate
directly to methods of <tt class="classname">string::body</tt>. I
can move <tt class="methodname">assign</tt> out of <tt class=
"classname">string</tt> and into <tt class=
"classname">string::body</tt>. And while I'm at it, I'll give it a
better name; <tt class="methodname">replace</tt><sup>[<a name=
"d0e167" href="#ftn.d0e167" id="d0e167">1</a>]</sup>.</p>
<pre class="programlisting">
namespace accu {

 class string {
 public:
  class body;
  class char_reference;
  ... ... ...
  char_reference operator[](size_t index);
  char operator[](size_t index) const;
  ... ... ...
 private: // representation
  counted_ptr&lt;body&gt; ptr;
 };

 class string::char_reference {
 public:
  char_reference(
   counted_ptr&lt;string::body&gt; &amp; ptr, 
   size_t index);
  char_reference &amp; operator=(char new_value);
  operator char() const;

 private:
  counted_ptr&lt;string::body&gt; &amp; ptr;
  size_t const index;
 };
}

namespace accu {
 struct string::body {
  size_t cached_length; // strlen(text)
  char * text;
  ... ... ...
  void replace(size_t index, char new_value);
  ... ... ...
 };
}
</pre>
<pre class="programlisting">
namespace accu {
 ... ... ...
 string::char_reference
 string::operator[](size_t index)
 {
  return char_reference(ptr, index);
 }

 char string::operator[](size_t index) const
 {
  return ptr-&gt;text[index];
 }
 ... ... ...
}

namespace accu {
 ... ... ...
 string::char_reference
 string::char_reference::operator=(
  char new_value)
 {
  ptr-&gt;replace(index, new_value);
  return *this;
 }
 string::char_reference::operator char() const
 {
  return ptr-&gt;text[index];
 }
 ... ... ...
}

namespace accu {
 size_t string::length() const
 {
  return ptr-&gt;cached_length;
 }
 ... ... ...
}
</pre>
<p>I like this. But something is not quite right. A code fragment
with a mistake somehow niggles at my subconscious till I spot it.
There is a mistake. It's <span class="emphasis"><em>so</em></span>
easy to make -- we've lost the call to <tt class=
"methodname">string::unshare_state()</tt>. Before delegating across
<tt class="methodname">operator-&gt;()</tt> the modifier must make
its own personal copy of the state. But this is not too hard to
fix. One way is to make <tt class=
"methodname">string::unshare_state()</tt> private, and grant
<tt class="classname">string::char_reference</tt> friendship to
<tt class="classname">string</tt>.</p>
<pre class="programlisting">
namespace accu {

 class string {
 public:
  class char_reference;
  friend class char_reference;
  ... ... ...
 private:
  void unshare_state();
  ... ... ...
 };
}


namespace accu {
 string::char_reference
 string::char_reference::operator=(
  char new_value)
 {
  ptr-&gt;unshare_state();
  ptr-&gt;replace(index, new_value);
  return *this;
 }
}
</pre>
<p>This friendship feels okay; <tt class="classname">string</tt>
and <tt class="classname">string::char_reference</tt> are very
closely related; by nesting. But just because it's a reasonable
solution doesn't mean it's the best solution. There's almost never
only one solution. Here's another.</p>
<pre class="programlisting">
namespace accu {
 ... ... ...
 string::char_reference
 string::char_reference::operator=(]
  char new_value)
 {
  counted_ptr&lt;string::body&gt;
   unshared(new body(ptr-&gt;text)); 
  ptr = unshared;
  ptr-&gt;replace(index, new_value);
  return *this;
 }
}
</pre>
<p>This is bit more complicated, but it has one thing going for it.
It enables us to remove <tt class="methodname">unshare_state()</tt>
from the <tt class="classname">string</tt> class. That in turn
means we can remove the friendship. The string class is thinning
out nicely. The only thing to remember is to do this indirect
unsharing in every modifier. That's not much to ask. But it is
duplication. And duplication is boring. And when your mind gets
bored it makes mistakes. So again, let's not rest on this solution,
let's see if there is a better one. But this time, let's try a
different approach. Ask yourself: &quot;what's an ideal solution?&quot; In a
sense we already know an answer to this. It's ...</p>
<pre class="programlisting">
namespace accu {
 ... ... ...
 string::char_reference
 string::char_reference::operator=(
  char new_value)
 {
  ptr-&gt;replace(index, new_value);
  return *this;
 }
}
</pre>
<p>At this point you're probably thinking &quot;Eh? - Jagger's lost it
this time. Isn't this the version with the error again?&quot; Yes. It
is! But I maintain this version has a lot going for it. Number one,
it was the first version so you could argue it's the most obvious
&quot;solution&quot;. Number two, it's the simplest &quot;solution&quot; since it's the
shortest<sup>[<a name="d0e219" href="#ftn.d0e219" id=
"d0e219">2</a>]</sup>. Nevertheless it isn't a solution since it
doesn't work. Let's take a step back and take a look at <tt class=
"classname">counted_ptr&lt;&gt;</tt></p>
<pre class="programlisting">
namespace accu {

 template&lt;typename type&gt;
 class counted_ptr {
 public:
  ... ... ...
  type * operator-&gt;() const;
  type &amp; operator*() const;
 private:
  type * ptr;
  size_t * count;
 };
}
</pre>
<p>Both operators are const queries, but both give non-const access
to the target object. This is perfectly reasonable; the counted
pointer is behaving exactly like a raw pointer. What we have here
is the hidden <span class="emphasis"><em>handle/body</em></span>
idiom. The user uses the <span class=
"emphasis"><em>handle</em></span> (<tt class=
"classname">string</tt>) directly as a value, and the <span class=
"emphasis"><em>body</em></span> (<tt class=
"classname">string::body</tt>) is effectively invisible. Hidden
<span class="emphasis"><em>handle/body</em></span> means the
<span class="emphasis"><em>body</em></span> is hidden from the user
of the <span class="emphasis"><em>handle</em></span>. In this case,
the <tt class="classname">counted_ptr&lt;string::body&gt;</tt> is
the link between the <tt class="classname">string</tt>-<span class=
"emphasis"><em>handle</em></span> and the <tt class=
"classname">string::body</tt>-<span class=
"emphasis"><em>body</em></span>. More specifically, <tt class=
"methodname">counted_ptr&lt;string::body&gt;::operator-&gt;()</tt>
is the usual way the <tt class="classname">string</tt> handle
traverses to it's body. For example</p>
<pre class="programlisting">
namespace accu {
 size_t string::length() const
 {
  return ptr-&gt;cached_length;
 }
 ... ... ...
 string::char_reference
 string::char_reference::operator=(
  char new_value)
 {
  ptr-&gt;replace(index, new_value);
  return *this;
 }
}
</pre>
<p>What we'd really like is for the expression <tt class=
"literal">ptr-&gt;</tt> to do different things in different cases.
For the query, to just return a read-only raw pointer. And for a
modifier to first make a deep copy and then return a read-write raw
pointer. And, as it turns out we can do this since we can, once
again, overload on const.</p>
</div>
<div class="sect1" lang="en">
<div class="titlepage">
<h2><a name="d0e281" id=
"d0e281"></a>cow_ptr&lt;type&gt; - Copy On Write pointer</h2>
</div>
<pre class="programlisting">
namespace accu {
 template&lt;typename type&gt;
 class cow_ptr { // moo
 public:
  ... ... ...
        type * operator-&gt;();
  const type * operator-&gt;() const;
 private:
  type * ptr;
  size_t * count;
 };
}
</pre>
<p>Let's look at our two examples again, this time using <tt class=
"classname">cow_ptr&lt;string::body&gt;</tt> instead of <tt class=
"classname">counted_ptr&lt;string::body&gt;</tt>. Here they are
again. Remember <tt class="varname">ptr</tt> is a <tt class=
"classname">cow_ptr&lt;string::body&gt;</tt></p>
<pre class="programlisting">
namespace accu {
 size_t string::length() const
 {
  return ptr-&gt;cached_length;
 }
}
</pre>
<p>This is a query. The compiler is forced to resolve <tt class=
"literal">ptr-&gt;</tt> as the const version of <tt class=
"methodname">cow_ptr&lt;string::body&gt;::operator-&gt;()</tt>,
which can simply return a read-only raw pointer. Recall that
<tt class=
"methodname">counted_ptr&lt;string::body&gt;::operator-&gt;()</tt>
returns a read-write raw pointer. In other words this</p>
<pre class="programlisting">
namespace accu {
 size_t string::length() const
 {
  ptr-&gt;cached_length = 42;
  ...
 }
}
</pre>
<p>will compile quite happily if <tt class="varname">ptr</tt> is a
<tt class="classname">counted_ptr&lt;string::body&gt;</tt>, which
is not a Good Thing. But it will generate a compiler error if
<tt class="varname">ptr</tt> is a <tt class=
"classname">cow_ptr&lt;string::body&gt;</tt>, which is a Good
Thing. The <tt class="classname">cow_ptr&lt;&gt;</tt> version is
type-safer. When you split a class into a handle and a body it's
easy to forget this subtlety: that the const-ness of a raw pointer
does not traverse the pointer.</p>
<pre class="programlisting">
namespace accu {
 string::char_reference
 string::char_reference::operator=(
  char new_value)
 {
  ptr-&gt;replace(index, new_value);
  return *this;
 }
}
</pre>
<p>This is a modifier. The compiler is forced to resolve <tt class=
"literal">ptr-&gt;</tt> as the non-const version of <tt class=
"methodname">cow_ptr&lt;string::body&gt;::operator-&gt;()</tt>
which can make a deep copy and then return a read-write raw
pointer. The apparently missing call to make a deep copy is no
longer an error; it has been refactored inside <tt class=
"methodname">operator-&gt;()</tt> itself. There is a single point
of definition, and no duplication. And the code in the
handle-methods has a common look and feel too. Here's a first cut
at <tt class="classname">cow_ptr&lt;&gt;</tt>.</p>
<pre class="programlisting">
namespace accu {
 template&lt;typename type&gt;
 class cow_ptr {
 public: // create/copy/destroy
  explicit cow_ptr(type * ptr);
  cow_ptr(const cow_ptr &amp; rhs);
  cow_ptr &amp; operator=(const cow_ptr &amp; rhs);
  ~cow_ptr();

 public: // access
        type * operator-&gt;();
  const type * operator-&gt;() const;
        type &amp; operator*();
  const type &amp; operator*() const;
  ... ... ...
 private: // plumbing
  void copy();
  type * checked_ptr() const;

 private: // state
  type * ptr;
  size_t * count;
 };
}
</pre>
<pre class="programlisting">
namespace accu {
 // cow_ptr&lt;&gt; - create/copy/destroy
 template&lt;typename type&gt;
 cow_ptr&lt;type&gt;::cow_ptr(type * p)
  : ptr(p), count(new size_t(1)) 
 {
  // all done
 }

 template&lt;typename type&gt;
 cow_ptr&lt;type&gt;::cow_ptr(const cow_ptr&amp; rhs)
  : ptr(rhs.ptr), count(rhs.count)
 {
  ++*count;
 }

 template&lt;typename type&gt;
 cow_ptr&lt;type&gt; &amp; 
 cow_ptr&lt;type&gt;::operator=(const cow_ptr&amp; rhs) 
 {
  ++*rhs.count;
  if (--*count == 0)
  {
   delete count;
   delete ptr;
  }
  ptr = rhs.ptr;
  count = rhs.count;
  return *this;
 }

 template&lt;typename type&gt;
 cow_ptr&lt;type&gt;::~cow_ptr()
 {
  if (--*count == 0)
  {
   delete count;
   delete ptr;
  }
 }
}

namespace accu { // cow_ptr&lt;&gt; - access
 template&lt;typename type&gt;
 type * 
 cow_ptr&lt;type&gt;::operator-&gt;()
 {
  copy();
  return checked_ptr();
 }

 template&lt;typename type&gt;
 const type * 
 cow_ptr&lt;type&gt;::operator-&gt;() const
 {
  return checked_ptr();
 }

 template&lt;typename type&gt;
 type &amp; 
 cow_ptr&lt;type&gt;::operator*()
 {
  copy();
  return *checked_ptr();
 }

 template&lt;typename type&gt;
 const type &amp; 
 cow_ptr&lt;type&gt;::operator*() const
 {
  return *checked_ptr();
 }
}

namespace accu { // cow_ptr&lt;&gt; - plumbing
 template&lt;typename type&gt;
 void
 cow_ptr&lt;type&gt;::copy() 
 {
  if (*count &gt; 1)
  {
   cow_ptr&lt;type&gt; unshared(new type(*ptr)));
   *this = unshared;
  }
 }

 template&lt;typename type&gt;
 type *
 cow_ptr&lt;type&gt;::checked_ptr() const
 {
  if (!ptr)
  {
   throw logic_error(&quot;cow_ptr&lt;&gt;: null&quot;);
  }
  return ptr;
 }
}
</pre>
<p>And we need only ensure <tt class="classname">string::body</tt>
has a copy constructor which makes a deep copy. Remember, thanks to
the <tt class="classname">string::char_reference</tt> proxy class,
the <tt class="classname">string::body</tt> copy constructor will
only be called if we are actually making a change.</p>
<pre class="programlisting">
namespace accu {
struct string::body {
 char * text;
 size_t cached_length; // strlen(text)
 ... ... ...
 body(const char * literal);
 body(const body &amp; rhs);
 ... ... ...
};

string::body::body(const body &amp; rhs)
 : text(new char[rhs.cached_length + 1])
 , cached_length(rhs.cached_length)
{
 strcpy(text, rhs.text);
}
... ... ...
}
</pre>
<p>My thanks, as ever, to Kevlin for his comments and guidance.
That's all for now.</p>
</div>
<div class="footnotes"><br>
<hr class="c2" width="100">
<div class="footnote">
<p><sup>[<a name="ftn.d0e167" href="#d0e167" id=
"ftn.d0e167">1</a>]</sup> It turns out that around the time I wrote
the article Kevlin was working on some slides for QA Training that
covered this very topic. Kevlin had seen and avoided this exact
problem; his method was called replace from the start.</p>
</div>
<div class="footnote">
<p><sup>[<a name="ftn.d0e219" href="#d0e219" id=
"ftn.d0e219">2</a>]</sup> I'm the first to admit an element of
sophistry in this.</p>
</div>
</div>
</p>
<p><strong>Notes:</strong>&nbsp;</p>
<p><em>More fields may be available via dynamicdata ..</em></p>
</div>
</channel>
</rss>
