soraなりの日々 - fc2 -

こころにひっかかったもの

[c++,0x]コードの中心でiを理解する -第一回 0x会 my_string-

やっと来た!
記念すべき、社内でやってる 0x会(別名 ccc [c++ cracks club])の第一回!!

で、始めるに当たって、メンバーで
「なにするよ?」って話あった結果。

「まずは、c++ のリハビリからでしょ!」
「じゃ、おさらい含めオレオレストリング作るってのどうよ?」
「みんなやったよね。」


て、ことでオレオレストリングを作ることに。

そう。そうですよ。
車輪の再発明ですよ。まさに。

でも、みんなやらなかった?
oop の勉強のためとかなんとかで。。。
ll 出身者とかやってないし、概念自体を知らないらしいね。
 概念だけでも知っておいて損しないと思うんだけどなー、、、
 内部では、どうせ同じようなことやってるんだし。。。)

で、第一回目の今日。
久方ぶりにやってみた!!


このエントリーをはてなブックマークに追加

でね。
やったわけですよ。
久しぶりにね。

いやー、ひどかった・・・orz


相当酷いわけですよ。
alloc の取り方からオブジェクトの切り分け。
はては、コピーコンストラクタまで。
基本がぜんっぜんできてない。。。
(もともとできる方ではないのだケレド・・・)

でも、がんばった。
まだまだ、うまいこと隠蔽できるし、キレイになるんだけど
とりあえず、いまの時点でソース公開してみる。
いやー、ほんと酷いな。。。

[kwn_string.h]
/**
 *  @file kwn_string.h
 */

#ifndef _KWN_STRING_H
#define _KWN_STRING_H

#include <string>

namespace kwn
{

  class string
  {
  public:
    /**
     *  @brief  constructor
     */
    string();
    string(const std::string& str) { string(str.c_str()); }
    string(const kwn::string& str) { string(str.c_str()); }
    string(const char* s);

    /**
     *  @brief  destructor
     */
    virtual ~string();

  public:
    int length() const { return size(); }
    int size() const { return m_str.n; }
    void clear() { m_str.clear(); }
    const char* c_str() const { return m_str.psz; }

    /**
     *  @brief  operator
     */
    string& operator=(const std::string& str) { return operator=(str.c_str()); }
    string& operator=(const kwn::string& str) { return operator=(str.c_str()); }
    string& operator=(char c) { return operator=(&c); }
    string& operator=(const char* s);

    string operator+(const std::string& str) const { return operator+(str.c_str()); }
    string operator+(const kwn::string& str) const { return operator+(str.c_str()); }
    string operator+(char c) const { return operator+(c); }
    string operator+(const char* s) const;

    string& operator+=(const std::string& str) { return operator+=(str.c_str()); }
    string& operator+=(const kwn::string& str) { return operator+=(str.c_str()); }
    string& operator+=(char c) { return operator+=(&c); }
    string& operator+=(const char* s);

    /** this is a test code... */
    void disp() { std::cout << m_str.psz << std::endl;}

  private:
    void allocate(int size);

  private:
    typedef struct M_STR {
      int n;
      char* psz;

      void init() {
        n = 0;
        psz = NULL;
      }
      void clear() {
        n = 0;
        if (psz) {
          delete [] psz;
          psz = NULL;
        }
      }
      int alloc(int size) {
        if (size == 0) return -1;
        if (n >= (size + 1)) return -1;

        if (n == 0) {
          n = size + 1;
          psz = new char [n + 1];
          return n;
        }

        M_STR buff;
        buff.init();
        buff.n = size + 1;
        buff.psz = new char [size + 1];
        memset(buff.psz, 0x00, size + 1);
        memcpy(&buff.psz, psz, n);
        clear();
        n = size + 1;
        psz = new char [size + 1];
        memset(psz, 0x00, size + 1);
        memcpy(psz, &buff.psz, size + 1);
        return n;
      }
    } M_STR;

    /**
     *  @brief  class member
     */
    M_STR m_str;
  };
} // namespace kwn

#endif /* _KWN_STRING_H */


[kwn_string.cpp]
#include <iostream>
#include <assert.h>

#include "kwn_string.h"

namespace kwn
{


  /**
   *  @brief  constructor
   */
  string::string()
  {
    m_str.init();
  }
  string::string(const char* s)
  {
    m_str.init();
    int n = strlen(s);
    allocate(n);
    memcpy(m_str.psz, s, n);
  }


  /**
   *  @brief  destructor
   */
  string::~string()
  {
    m_str.clear();
  }


  /**
   *  @brief  operator=
   */
  string& string::operator=(const char* s) {
    clear();
    int n = strlen(s);
    allocate(n);
    memcpy(m_str.psz, s, n);
    return *this;
  }


  /**
   *  @brief  operator+
   */
  string string::operator+(const char* s) const {
    kwn::string buff = *this;
    buff += s;
    return buff;
  }


  /**
   *  @brief  operator+=
   */
  string& string::operator+=(const char* s) {
    int n = m_str.n + strlen(s);
    allocate(n);
    strncat(m_str.psz, s, strlen(s));
    return *this;
  }


  /**
   *  @brief  allocate memories
   */
  void string::allocate(int size) {
    if (size == 0) return;
    int ret = m_str.alloc(size);
    assert(ret > 0);
    return;
  }
}


/**
 *  @brief  test function
 *
 *   command line : g++ kwn_string.cpp
 *                : ./a.out
 *                :   hello world.
 *                :   hello world.
 *        gcc ver : 4.0.1 (Apple Inc. build 5465)
 */
int main()
{
  /** operator test. '+' */
  kwn::string str = "hello";
  kwn::string str2 = " world.";
  kwn::string str3 = str + str2;
  str3.disp();

  /** operator test. '+=' */
  kwn::string str4 = "hello";
  str4 += " world.";
  str4.disp();

  /** clear test. */
  str4.clear();
  str4.disp();

  return 0;
}


このオレオレストリングが一通り終わったら、
次はテンプレートプログラミング!
いやはや、これだけでもスッゲー楽しいんだけど、
c++0x に入るのはいつのことやら・・・orz


環境:PowerBook G4 1.25 GHz memory 1 GB
   :gcc version 4.0.1 (Apple Inc. build 5465)
このエントリーをはてなブックマークに追加

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://sora2hs.blog70.fc2.com/tb.php/426-d814a902
この記事にトラックバックする(FC2ブログユーザー)