Skip to content

Commit 0de7f4e

Browse files
authored
Merge pull request #1614 from berryzplus/feature/add_codec_test
CCodeBaseの変換テストを追加する
2 parents d50a6c5 + fcb5932 commit 0de7f4e

File tree

3 files changed

+440
-5
lines changed

3 files changed

+440
-5
lines changed

sakura_core/charset/CCodeBase.h

Lines changed: 46 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@
2727
#define SAKURA_CCODEBASE_1AB194FB_933C_495E_A3A3_62E117C72644_H_
2828
#pragma once
2929

30+
#include <cstddef>
31+
#include <string>
32+
#include <string_view>
33+
3034
#include "mem/CNativeW.h"
3135
#include "CEol.h"
3236

@@ -39,6 +43,12 @@ enum EConvertResult{
3943

4044
struct CommonSetting_Statusbar;
4145

46+
//! 変換元バイナリシーケンスを表す型。
47+
using BinarySequenceView = std::basic_string_view<std::byte>;
48+
49+
//! 復元後バイナリシーケンスを表す型。
50+
using BinarySequence = std::basic_string<std::byte>;
51+
4252
/*!
4353
文字コード基底クラス。
4454
@@ -47,8 +57,42 @@ struct CommonSetting_Statusbar;
4757
*/
4858
class CCodeBase{
4959
public:
50-
virtual ~CCodeBase(){}
51-
// virtual bool IsCode(const CMemory* pMem){return false;} //!< 特定コードであればtrue
60+
virtual ~CCodeBase() noexcept = default;
61+
62+
/*!
63+
特定コードをUnicodeにエンコードする
64+
65+
@param [in] cSrc 変換対象のバイナリシーケンス
66+
@param [out,opt] pResult 変換結果を受け取る変数
67+
@returns サクラエディタ仕様のUnicode文字列
68+
*/
69+
virtual CNativeW CodeToUnicode( BinarySequenceView cSrc, bool* pResult = nullptr )
70+
{
71+
CMemory cmemSrc( cSrc.data(), cSrc.size() );
72+
CNativeW cDest;
73+
auto result = CodeToUnicode( cmemSrc, &cDest );
74+
if( pResult ){
75+
*pResult = result == RESULT_COMPLETE;
76+
}
77+
return cDest;
78+
}
79+
80+
/*!
81+
Unicodeを特定コードにデコードする
82+
83+
@param [in] cSrc 変換対象のUnicodeシーケンス
84+
@param [out,opt] pResult 変換結果を受け取る変数
85+
@returns バイナリシーケンス
86+
*/
87+
virtual BinarySequence UnicodeToCode( const CNativeW& cSrc, bool* pResult = nullptr )
88+
{
89+
CMemory cDest;
90+
auto result = UnicodeToCode( cSrc, &cDest );
91+
if( pResult ){
92+
*pResult = result == RESULT_COMPLETE;
93+
}
94+
return BinarySequence( static_cast<std::byte*>(cDest.GetRawPtr()), cDest.GetRawLength() );
95+
}
5296

5397
//文字コード変換
5498
virtual EConvertResult CodeToUnicode(const CMemory& cSrc, CNativeW* pDst)=0; //!< 特定コード → UNICODE 変換

sakura_core/charset/CCodeFactory.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
#define SAKURA_CCODEFACTORY_A5C6C204_F9BD_42BA_A5CD_1B086833CCA4_H_
2828
#pragma once
2929

30-
class CCodeBase;
30+
#include <memory>
31+
#include "charset/CCodeBase.h"
3132

3233
class CCodeFactory{
3334
public:
@@ -36,5 +37,14 @@ class CCodeFactory{
3637
ECodeType eCodeType, //!< 文字コード
3738
int nFlag //!< bit 0: MIME Encodeされたヘッダをdecodeするかどうか
3839
);
40+
41+
//! eCodeTypeに適合する CCodeBaseインスタンス を生成
42+
static std::unique_ptr<CCodeBase> CreateCodeBase(
43+
ECodeType eCodeType //!< 文字コード
44+
)
45+
{
46+
return std::unique_ptr<CCodeBase>( CreateCodeBase( eCodeType, 0 ) );
47+
}
3948
};
49+
4050
#endif /* SAKURA_CCODEFACTORY_A5C6C204_F9BD_42BA_A5CD_1B086833CCA4_H_ */

0 commit comments

Comments
 (0)