2013年1月29日火曜日

read-all from std::istream to std::string


libWRP-GLEWの実装に書いたC++(11)なstd::istreamからstd::stringでぶっこ抜く部分のサンプル(╹◡╹)

struct sample final
{
  void source(std::string&& v)
  { data_ = std::move(v); }

  void source(std::istream&& s)
  {
    s.seekg(0, std::ios::end);
    auto size = s.tellg();
    s.seekg(0, std::ios::beg);
    source_.resize(size);
    s.read(const_cast<char*>(source_.data()), size);
  }

  const std::string& source() const
  { return source_; }

private:
  std::string source_;
};

使うときは

sample s;
s.source(std::ifstream("hoge.vs"));
とかそういう想定。或いはstd::stringに可換なオブジェクト直接か。

実際のところはシェーダーオブジェクトの型でstd::stringまたはstd::istreamからソースをセットする辺りで登場。ちなみにコード量を縮めたいだけなら一旦sizeを受けずにresizeしてreadで.size()を使う事もできるけど、ソースコードが縮んでも実行効率は悪くなると予想されるのでこれで良いかな(╹◡╹)

reference: 

0 件のコメント:

コメントを投稿