不連続なメモリ

次に、container が保持しているメモリが不連続である場合、困るわけ。
キャッシュするっていう手もあるけれど、MBCS だとオーバーヘッドデカいよね。

const_iterator from = container.begin();
const_iterator to = find_first(from, container.end(), _T('\n'));
const size_t n = std::distance(from, to);
std::vector<char> temp; /* メモリ食う */
std::transform(from, to, std::back_inserter(temp), FitToMultiByte()); /* 時間も食う */
::TextOut(&temp[0], temp.size());

じゃぁ、ってことで連続性を保証させましょうと。

const_iterator from = container.begin();
const_iterator to = find_first(from, container.end(), _T('\n'));
container.Contiguous(from, to);
::TextOut(GetPointer(from), std::distance(from, to));

これも、場合によってはメモリと時間食うよな。
じゃぁ、ってことで連続性を見ましょうと。
とりあえず、ギャップは1個としましょう。

const_iterator from = container.begin();
const_iterator to = find_first(from, container.end(), _T('\n'));

if (container.IsContiguous(from, to)) {
  ::TextOut(GetPointer(from), std::distance(from, to));
}
else {
  const_iterator middle = container.GetContiguousEnd(from, to);
  ::TextOut(GetPointer(from), std::distance(from, middle));
  ::TextOut(GetPointer(middle), std::distance(middle, to));
}

ギャップが1個っていう仮定がいやだなと思うわけですよ。
じゃぁって事で連続メモリ単位で for_each する?

struct TextOutFunc {
  void operator()(const Container::pointer* p1, size_t n) {
    ::TextOut(p1, n);
  }
};

const_iterator from = container.begin();
const_iterator to = find_first(from, container.end(), _T('\n'));

ContiguousIterators span = container.GetContigunousIterators(from, to);
std::for_each(span.first, span.last, TextOutFunc());

これ、ホントにベストな解?