#ifndef TMWA_STRINGS_FSTRING_HPP #define TMWA_STRINGS_FSTRING_HPP // strings/fstring.hpp - An owned, reference-counted immutable string. // // Copyright © 2013-2014 Ben Longbons // // This file is part of The Mana World (Athena server) // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . # include # include # include "base.hpp" namespace strings { /// An owning string that has reached its final contents. /// The storage is NUL-terminated class FString : public _crtp_string { struct Rep { size_t count; size_t size; char body[]; }; static uint8_t empty_string_rep[sizeof(Rep) + 1]; Rep *owned; template void _assign(It b, It e); public: FString(); FString(const FString&); FString(FString&&); FString& operator = (const FString&); FString& operator = (FString&&); ~FString(); explicit FString(const MString& s); template FString(char (&s)[n]) = delete; template FString(const char (&s)[n]); template FString(It b, It e); FString(XPair p); //FString(const FString&) FString(const TString&); FString(const SString&); FString(ZString); FString(XString); template FString(const VString& v); iterator begin() const; iterator end() const; const FString *base() const; const char *c_str() const; }; // cxxstdio helpers // I think the conversion will happen automatically. TODO test this. // Nope, it doesn't, since there's a template // Actually, it might now. const char *decay_for_printf(const FString& fs); __attribute__((format(printf, 2, 0))) int do_vprint(FString& out, const char *fmt, va_list ap); class StringConverter { FString& out; char *mid; public: StringConverter(FString& s); ~StringConverter(); char **operator &(); }; StringConverter convert_for_scanf(FString& s); } // namespace strings # include "fstring.tcc" #endif // TMWA_STRINGS_FSTRING_HPP