不連続なメモリ
次に、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());
これ、ホントにベストな解?