<HTML>
<!--
     Copyright (c) Jeremy Siek 2000
    
     Distributed under the Boost Software License, Version 1.0.
     (See accompanying file LICENSE_1_0.txt or copy at
     http://www.boost.org/LICENSE_1_0.txt)
  -->
<Head>
<Title>Read Write Property Map</Title>
<BODY BGCOLOR="#ffffff" LINK="#0000ee" TEXT="#000000" VLINK="#551a8b" 
	ALINK="#ff0000"> 
<IMG SRC="../../../boost.png" 
     ALT="C++ Boost" width="277" height="86"> 

<BR Clear>

<H2>
<A NAME="concept:ReadWritePropertyMap"></A>
<BR>
Read/Write Property Map
</H2>    

A Read/Write Property Map can be used to read property values via
the <tt>get()</tt> function and can be used to write property values
via the <tt>put()</tt> function.  

<H3>Refinement of</H3>

<a href="./ReadablePropertyMap.html">Readable Property Map</a>
and
<a href="./WritablePropertyMap.html">Writable Property Map</a>



<h3>Notation</h3>

<Table>
<TR>
<TD><tt>PMap</tt></TD>
<TD>A type that is a model of Read/Write Property Map.</TD>
</TR>

</table>

<h2>Associated Types</h2>

<table border>

<tr>
<td>Property Map Category 
<td><TT>boost::property_traits&lt;PMap&gt;::category</TT></td> 
<td>
The category of the property map must be a type convertible to
<TT>read_write_property_map_tag</TT>.
</td>
</tr>

</table>


<h3>Concept Checking Class</h3>

<pre>
  template &lt;class PMap, class Key&gt;
  struct ReadWritePropertyMapConcept
  {
    typedef typename property_traits&lt;PMap&gt;::category Category;
    typedef boost::read_write_property_map_tag ReadWriteTag;
    void constraints() {
      function_requires&lt; ReadablePropertyMapConcept&lt;PMap, Key&gt; &gt;();
      function_requires&lt; WritablePropertyMapConcept&lt;PMap, Key&gt; &gt;();
      function_requires&lt; ConvertibleConcept&lt;Category, ReadWriteTag&gt; &gt;();
    }
  };
</pre>

<h3>See Also</h3>

<a href="./property_map.html">Property map concepts</a>


<br>
<HR>
<TABLE>
<TR valign=top>
<TD nowrap>Copyright &copy 2000</TD><TD>
<a HREF="http://www.boost.org/people/jeremy_siek.htm">Jeremy Siek</a>, Univ.of Notre Dame (<A HREF="mailto:jsiek@lsc.nd.edu">jsiek@lsc.nd.edu</A>)
</TD></TR></TABLE>

</BODY>
</HTML> 
