1

現時点では、次のようなコードがあります。

#define ______ 0x0000
static const uint16_t plane0[256] = {
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047,
    0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F,
    0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057,
    0x0058, 0x0059, 0x005A, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, 0x039C, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ...
};
#undef ______

uint16_t caseup(uint16_t wc)
{
    return (plane0[wc] == 0x0000) ? wc : plane0[wc];
}

私は本当にそのcaseup機能を単純なものに置き換えたいと思っていますreturn plane0[wc]。余分な比較分岐は、大局的に見ればそれほどコストがかからないかもしれませんが、それを取り除けば、コードは確実により効率的になります。

しかし、テーブルを書き直す必要はありません。ツールを使用して書き直すことさえしません。ケース マッピング テーブルが大量のガベージ 16 進値でごちゃごちゃになるのは望ましくありません。私は、表を大部分は元のマクロ化したままにしておき、16 進数の値を実際に非 ID ケース マッピングが必要な場所にだけ配置したいと考えています。

C ++ 11でこれを行う最もクリーンな方法は何ですか?

4

3 に答える 3

0

私はこれについて考えました:

template<int N>
struct PlaneMapping {
    uint16_t i;
    uint16_t data[N];

    template<typename... Args>
    constexpr PlaneMapping(Args... a) : i(0), data { uint16_t(a ? (i++,a) : i++)... }
    {}
};

static const PlaneMapping<256> plane0(
    ______, ______, ______, ______, ______, ______, ______, ______,
    ______, ______, ______, ______, ______, ______, ______, ______,
    ...
);

uint16_t caseup(uint16_t wc)
{
    return plane0.data[wc];
}

これはかなりきれいだと思いますが、これらすべてのi++s は醜く、-O1から大量のコードを実行するのではなく、静的データに至るまでコンパイルする前に、合格するかそれ以上にする必要があります_main。よりクリーンなソリューションはありますか?

于 2013-11-05T01:26:10.893 に答える
0
uint16_t caseup(uint16_t wc)
{
    static const std::array<uint16_t, 256> plane0Map = [&]
    {
        std::array<uint16_t, 256> mapping;

        for(size_t i = 0; i < 256; ++i)
            mapping[i] = plane0[i] == 0 ? i : plane0[i];

        return mapping;
    }();

    return plane0Map[wc];
}
于 2013-11-05T02:35:46.840 に答える