#include "python.h"

namespace python {

   int String::capacity() const {
      return max_size();
   }

   String::String (PyObject *pyob, bool owned): SeqBase<Char>(pyob, owned) {
      validate();
   }

   String::String (const Object& ob): SeqBase<Char>(ob) {
      validate();
   }

   String::String()
      : SeqBase<Char>( PyString_FromStringAndSize( "", 0 ), true )
      {
         validate();
      }

   String::String (const std::string& v )
      : SeqBase<Char>( PyString_FromStringAndSize( const_cast<char*>(v.data()), v.length() ), true )
      {
         validate();
      }


   String::String (const std::string& v, std::string::size_type vsize)
      :SeqBase<Char>(PyString_FromStringAndSize( const_cast<char*>(v.data()), vsize), true)
      {
         validate();
      }

   String::String (const char *v, int vsize)
      :SeqBase<Char>(PyString_FromStringAndSize (const_cast<char*>(v), vsize), true)
      {
         validate();
      }

   String::String (const char* v)
      :SeqBase<Char>(PyString_FromString (v), true) 
      {
         validate();
      }
   // Assignment acquires new ownership of pointer

   String& String::operator= (const Object& rhs) {
      return (*this = *rhs);
   }

   String& String::operator= (PyObject* rhsp) {
      if(ptr() == rhsp) return *this;
      set (rhsp);
      return *this;
   }
   // Membership
   bool String::accepts (PyObject *pyob) const {
      return pyob && PyString_Check (pyob);
   }

   // Assignment from C string
   String& String::operator= (const std::string& v) {
      set(PyString_FromStringAndSize (const_cast<char*>(v.data()), v.length() ), true);
      return *this;
   }
   // 
   // Queries
   int String::size () const { 
      return PyString_Size (ptr());
   }

   String::operator std::string () const {
      return std::string( PyString_AsString( ptr() ), PyString_Size( ptr() ) );
   }           

   std::string String::as_std_string() const {
      return std::string( PyString_AsString( ptr() ), PyString_Size( ptr() ) );
   }           

}


syntax highlighted by Code2HTML, v. 0.9.1