ifndef Rice__String__hpp_ define Rice__String__hpp_

include “Identifier.hpp” include “Builtin_Object_defn.hpp” include “to_from_ruby_defn.hpp” include “detail/ruby.hpp” include <string>

namespace Rice {

//! A Wraper for the ruby String class.

! This class provides a C++-style interface to ruby's String class and
  its associated rb_str_* functions.

  Example:
  \code
    String s(String::format("%s: %d", "foo", 42));
    std::cout << s.length() << std::endl;
  \endcode

class String

: public Builtin_Object<T_STRING>

{ public:

//! Construct a new string.
String();

//! Wrap an existing string.
String(VALUE v);

//! Wrap an existing string.
String(Object v);

//! Construct a String from an Identifier.
String(Identifier id);

//! Construct a String from a null-terminated C string.
String(char const * s);

//! Construct a String from an std::string.
String(std::string const & s);

//! Format a string using printf-style formatting.
static String format(char const * s, ...);

//! Get the length of the String.
/*! \return the length of the string.
  /
size_t length() const;

//! Get the character at the given index.
/*! \param index the desired index.
    \return the character at the given index.
  /
char operator[](ptrdiff_t index) const;

//! Return a pointer to the beginning of the underlying C string.
char const * c_str() const;

//! Return a copy of the string as an std::string.
std::string str() const;

//! Create an Identifier from the String.
/*! Calls rb_intern to create an ID.
    \return an Identifier holding the ID returned from rb_intern.
  /
Identifier intern() const;

};

} // namespace Rice

template<> inline Rice::String from_ruby<Rice::String>(Rice::Object x) {

return Rice::String(x);

}

template<> inline Rice::Object to_ruby<Rice::String>(Rice::String const & x) {

return x;

}

include “Builtin_Object.ipp”

endif // Rice__String__hpp_