String blog

Posted by Crazy Star on Feb. 21, 2019, 3:07 p.m.

ggs_string.cpp

#include "ggs_string.h"

namespace G

{

  String::String() :

    data()

  {

    c_str = "";

    n = 1;

    is_loaded = false;

  }

  String::String( const char* s ) :

    String()

  {

    c_str = s;

    n = 0;

    while( s[n] ) ++n;

    ++n;

  }

  const char* get( String s )

  {

    if( !s.is_loaded ) return s.c_str;

    const char* c = (const char*)s.data.ptr;

    return c;

  }

  String operator+(const String& a, const String& b)

  {

    if( !a.n ) return b;

    if( !b.n ) return a;

    String c;

    u32 n = a.n + b.n - 1;

    if( add( &c.data, n ) )

    {

      s8* concat = c.data.ptr + a.n;

      u32 i, j = a.n-1;

      for( i=0; i<j; ++i )

        c.data.ptr[i] = (s8)(a.c_str[i]);

      for( i=0; i<b.n; ++i )

        c.data.ptr[j+i] = (s8)(b.c_str[i]);

      c.is_loaded = true;

      c.n = n;

      c.c_str = (const char*)c.data.ptr;

    }

    return c;

  }

  String& operator+=( String& a, const String& b)

  {

    return a = a + b;

  }

}

ggs_string.h

#ifndef GGS_STRING_H_INCLUDED

#define GGS_STRING_H_INCLUDED

#include "../Memory/ggs_dynamic_list.h"

namespace G

{

  struct String

  {

    const char* c_str;

    List<s8> data;

    b32 is_loaded;

    u32 n;

    String();

    String( const char* s );

  };

  const char* get( String s );

  String operator+(const String& a, const String& b);

  String& operator+=( String& a, const String& b);

}

#endif // GGS_STRING_H_INCLUDED

Comments