Skip to content

Instantly share code, notes, and snippets.

View sergey-shambir's full-sized avatar

Sergey Shambir sergey-shambir

  • iSpring Solutions
View GitHub Profile
@sergey-shambir
sergey-shambir / split_words.cpp
Last active March 21, 2016 14:45
функция SplitWords на базе boost::trim и boost::split.
// Используем split для разбиения текста на слова
// предикат, возвращённый функцией 'boost::is_space()', отмечает пробельные символы как разделители
// token_compress_on гарантирует склеивание нескольких пробельных символов в один
// 'boost::trim' убирает пробельные символы в начале и в конце (иначе в words окажутся пустые слова).
vector<string> SplitWords(string const& text)
{
std::string trimmed = boost::trim_copy(text);
vector<string> words;
boost::split(words, trimmed, boost::is_space(), boost::token_compress_on);
return words;
@sergey-shambir
sergey-shambir / cocos_make.cpp
Created March 22, 2016 05:27
Cocos2d-x make function
template <class T, class ...TArgs>
T *make_cc(TArgs&&... args)
{
T *ret = new (std::nothrow) T;
if (ret && ret->init(std::forward<TArgs>(args)...)) {
ret->autorelease();
return ret;
}
CC_SAFE_RELEASE(ret);
return nullptr;
// pixels to dialog units
{
WTL::CDialogBaseUnits units(GetFont(), m_hWnd);
WTL::CSize size = units.MapDialogPixels(WTL::CSize(800, 520));
wchar_t buffer[2000];
wsprintf(buffer, L"%dx%d", size.cx, size.cy);
MessageBoxW(buffer, L"SIZE", MB_OK);
}
// map dialog units to pixels

Варианты для проекта "Транслятор"

Чтобы выполнить проект, следует составить спецификацию языка и затем составить язык по этой спецификации. Спецификация включает в себя

  • описание ключевой парадигмы языка (императивный, структурный, процедурный, объектно-ориентированный) и краткое описание особенностей (3-4 предложения)
  • лексическая структура: алфавит, список ключевых слов, список токенов-разделителей, список операторов.
  • синтаксические и семантические особенности: как выполнена поддержка разных типов данных
  • грамматика языка в EBNF нотации, проверенная через Flex/Bison

Варианты

#include <chrono>
int main()
{
// Через системные часы получаем объект типа time_point.
auto timePointBefore = std::chrono::system_clock::now();
RunSomeLongOperation();
// Получаем второй момент времени (после операции).
void VerifyText(const std::wstring &text, const std::wstring expectedText)
{
const auto pair = boost::mismatch(text, expectedText);
const bool textEnded = (pair.first == text.end());
const bool expectedEnded = (pair.second == expectedText.end());
if (textEnded)
{
if (expectedEnded)
{

Хорошая замена DWORD/int для кодов ошибок при работе с API ОС

Минимальный пример выдаёт “no such file or directory”:

#include <system_error>
#include <Windows.h>

void RaiseSystemError()
{
using String = char [];
using ArrayInt = int [];
// Операции над массивом char
- получение длины
- доступ чтение/запись к элементу строки (+ проверка границ, при выходе кидать панику (или abort))
- выделение памяти под локальный массив известной длины
// Первая модель: массив статически известного размера
- выделение памяти под локальный массив:
/// Примерный набросок применения указателей на функции и void*
// для разделения функций шагов анимации и конкретного "рецепта" цельной анимации
// структурирует данные для функции doMoveStep
struct MoveData
{
float x;
float y;
};
case DeviceCMYK:
{
double dCyan = m_uColor.cmyk[0];
double dMagenta = m_uColor.cmyk[1];
double dYellow = m_uColor.cmyk[2];
double dBlack = m_uColor.cmyk[3];
double dRed = dCyan * (1.0 - dBlack) + dBlack;
double dGreen = dMagenta * (1.0 - dBlack) + dBlack;
double dBlue = dYellow * (1.0 - dBlack) + dBlack;