-
Notifications
You must be signed in to change notification settings - Fork 162
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WIP] CDataProfileの通常変換からStaticStringを切り離す #1150
[WIP] CDataProfileの通常変換からStaticStringを切り離す #1150
Conversation
変換対象型の中で唯一、StaticStringだけがテンプレートパラメータを要求する。 この特徴をもって「intやboolと同列に扱えない型」と解釈して他と分離しておく。
✅ Build sakura 1.0.2518 completed (commit c0832983c3 by @berryzplus) |
sakura_core/CDataProfile.h
Outdated
if( IOProfileData( pszSectionName, pszEntryKey, buf ) ){ | ||
//StaticString<WCHAR, N>に変換 | ||
szEntryValue = buf.c_str(); | ||
ret = buf.length() < _countof2(szEntryValue); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
buf.length()
と _countof2(szEntryValue)
は逆だったりしないですか?
単体テストが欲しい感じですね。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
書くとこマチガッタ...
buf.length()
と_countof2(szEntryValue)
は逆だったりしないですか?
単体テストが欲しい感じですね。
あるあるですねw
buf.length()
= 代入しようとする文字列の文字列長(NUL終端含まない)
_countof2(szEntryValue)
= 代入先バッファのサイズ(NUL終端含む)
で、「代入する文字列がバッファに収まったらtrue」としたいので合っています。
I/Oクラスなので単体テストを投入するとテスト所要時間が延びます。
CProfile側のチューニング(たぶん、パフォーマンスに難がある)もまだなので
単体テスト投入はギリギリまで先延ばししたいと思っています。
これは仕様変更ではなくリファクタリングだと思います |
内部仕様変更と外部仕様変更(対チェンジログといういみで)とに分けた方がラベル付けは簡単な気もしてますが、ラベルにこだわる必要もあまりない気もしていて、とりあえずラベル付けられてないものを付けている格好です。 |
sakura_core/CDataProfile.h
Outdated
//文字列読み込み | ||
if( IOProfileData( pszSectionName, pszEntryKey, buf ) ){ | ||
//StaticString<WCHAR, N>に変換 | ||
szEntryValue = buf.c_str(); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
szEntryValue = buf.c_str();って要はwcscpy_sですよね。
これって従来のコメントの通り、_set_invalid_parameter_handlerを設定しないかぎり「後ろを切り詰める」わけでもなくabort/exitしますよね、確か。
その辺はどうする予定なんでしたっけ。
sakura/sakura_core/util/StaticType.h
Lines 106 to 107 in b71888b
void Assign(const CHAR_TYPE* src){ if(!src) m_szData[0]=0; else wcscpy_s(m_szData,_countof(m_szData),src); } | |
Me& operator = (const CHAR_TYPE* src){ Assign(src); return *this; } |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ncpyのtruncateに変えたいです。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
ncpyのtruncateに変えたいです。
このコメント残しておくと誤解が生まれそうなので補足します。
ここの意図は、 StaticString<WCHAR,N>::operator = (const WCHAR*)
を呼び出した結果で、桁あふれabortが発生しないようにしたいってことです。
そうするために、(wcs)ncpy に文字数 _TRUNCATE を指定するようにしたいと言ってます。
どちらかと言うと、先に「設定ファイル読み取りの失敗を検知できるようにしたい」の issue を立てて CDataProfile の アーキテクチャ変更を進めていくのがよいかな、と思っています。
せっかくapprove 頂きましたが、単なるリファクタリングに留まるように修正入れたいと思います。たぶん深夜に。 |
template <int N> | ||
void profile_to_value(const wstring& profile, StaticString<WCHAR, N>* value) | ||
{ | ||
wcscpy_s(value->GetBufferPointer(),value->GetBufferCount(),profile.c_str()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
う~ん。これ、abortするなぁ・・・。
sakura/sakura_core/CDataProfile.h
Lines 134 to 138 in 8ca0e39
//StringBufferW | |
void profile_to_value(const wstring& profile, StringBufferW* value) | |
{ | |
wcscpy_s(value->pData,value->nDataCount,profile.c_str()); | |
} |
これもやっぱり abort するなぁ・・・。
#1145 でコメント消したの失敗だったかなぁ・・・。
変更をやめてリファクタリング(=処理は変えない)にしようと思ったのは、
現状で問題のないコードを問題ある感じにするのはまずい、と思ったからでした。
なんとなく、 wcsncpy_s + _TRUNCATE
で「強制切り捨て」にする文化なのかと思っていましたが、思い違いで思い込んでたみたいです。
この辺を踏まえて、追加の修正をしようと思います。
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
僕もabortで処理するのは最終手段で安全側に倒した結果であるのは理解していますけど、それがテキストエディタに求められるものかと言われると、ちょっと。
要するに起動中にデータが壊れていて設定ファイルに長いデータが一か所でも書き込まれていたら、次回コントロールプロセスが起動中に死亡して、iniを削除しないかぎりエディタとして完全に死ぬということなので。
必要な範囲で、_TRANCATE系で無視するか、エラーを検出してデフォルト値を書き戻すようにするとか、対応がそれぞれあったほうが、より好ましいと思っています。
この辺は、もともとがいい加減だっただけで、新しい方針があるなら、それでいいと思います。
✅ Build sakura 1.0.2524 completed (commit 236f1dcd0a by @berryzplus) |
IODataProfileのコメント修正を先に済ませたいので一旦保留。 |
TODO: issue立てて、全体として何をどうしたいかが分かるようにする。 |
やりたいことの最終目標に関しての issue を立てました。 #1188 設定項目がなかったらデフォルト設定を使うようにしたい で、当座の作業としては、設定が読み込めなかったことを検知する機能をCDataProfileに組み込みたいってことなんで、それが分かる感じのサブissueを立てたいと思っています。 しっくり来るissueタイトルが思いつかないので、今日は諦めて祝日(=建国記念日)に向けて考える感じっす。 |
このPRの変更内容は評価のしようがないと思うので #1363 でやってるプレ・スモークテストの課題が解決してからの導入としたいです。 |
モチベーションが尽きたので閉じてしまいます。 #1394 |
PR の目的
CDataProfileの通常のデータ変換からStaticStringを切り離し、変換対象を分かりやすくします。
カテゴリ
※戻り値の意味を追加したので、リファクタリングではありません。
PR の背景
CDataProfile はデータ変換クラスです。
変換に対応する型は IODataProfile のコメントにリストされている通りです。
sakura/sakura_core/CDataProfile.h
Lines 159 to 169 in 48c5110
変換に対応する型の中に、他と違う特性を持った型が2つあります。
StaticString<WCHAR, N>
変換対象型の中で唯一、テンプレートパラメータ要求する型です。StringBufferW
この型はtypedef const StringBufferW_ StringBufferW;
です(const型です)。いずれも「文字列」を格納する型なので、ある意味で「無変換」です。
std::wstring
とは異なり、バッファにサイズ上限があるので、無変換でも「変換失敗」が起こりうるため「変換が必要」という奇妙な存在です。
今回は先に、
StaticString<WCHAR, N>
を通常変換から切り離します。型がテンプレートパラメータを要求するということは、
「intやboolとは同列に扱えない」ということでもあります。
IOProfileData
のオーバーロードテンプレートを用意して、通常の入出力テンプレートから切り離します。
これにより、通常の入出力テンプレートが対応する変換型は
テンプレートパラメータを要求しない型のみとなります。
PR のメリット
PR のデメリット (トレードオフとかあれば)
PR の影響範囲
関連チケット
参考資料