Groovy DSL: обработка этикеток

Для простых вещей я просто использую следующее:

unsigned TokenizeString(const std::string& i_source,
                        const std::string& i_seperators,
                        bool i_discard_empty_tokens,
                        std::vector<std::string>& o_tokens)
{
    unsigned prev_pos = 0;
    unsigned pos = 0;
    unsigned number_of_tokens = 0;
    o_tokens.clear();
    pos = i_source.find_first_of(i_seperators, pos);
    while (pos != std::string::npos)
    {
        std::string token = i_source.substr(prev_pos, pos - prev_pos);
        if (!i_discard_empty_tokens || token != "")
        {
            o_tokens.push_back(i_source.substr(prev_pos, pos - prev_pos));
            number_of_tokens++;
        }

        pos++;
        prev_pos = pos;
        pos = i_source.find_first_of(i_seperators, pos);
    }

    if (prev_pos < i_source.length())
    {
        o_tokens.push_back(i_source.substr(prev_pos));
        number_of_tokens++;
    }

    return number_of_tokens;
}

Тщательно оговорка: я пишу программное обеспечение обработки данных в реальном времени, где данные поступают через двоичные файлы, сокеты или какой-либо вызов API (I / O, камера). Я никогда не использую эту функцию для чего-то более сложного или критического по времени, чем чтение внешних файлов конфигурации при запуске.

1
задан Pavel Bernshtam 31 August 2010 в 04:13
поделиться

1 ответ

Я не верю, что вы можете достичь этого Таким образом, вам нужно немного изменить свой DSL, чтобы получить эту информацию. Вот как вы можете этого добиться:

class Foo {
    static plan = {
        vplan_testing {
            dir 'global_storage'
        }
    }
}

def closure = Foo.plan
closure.delegate = this
closure()

def methodMissing(String name, Object args) {   
    println "$name $args"     
    if(args[0] instanceof Closure) 
       args[0].call()
} 

Результатом будет

dir [global_storage]

или вы можете определить свой dsl следующим образом:

class Foo {
    static plan = {
        vplan_testing {
            test dir:'global_storage'
        }
    }
}

замените «test» на что-то значимое для вашего домена. В этом случае вывод будет следующим:

test [[dir:global_storage]]

Надеюсь, это поможет

-ken

2
ответ дан 2 September 2019 в 21:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: