TProcura
Biblioteca em C++ para testes paramétricos de algoritmos, e coleção de algoritmos de procura e otimização
Loading...
Searching...
No Matches
compact.h
Go to the documentation of this file.
1// compat.h
2#pragma once
3#include <cstdio>
4#include <cstring>
5#include <iostream>
6#include <locale>
7
8#ifdef _WIN32
9#include <windows.h>
10#endif
11
12namespace compat {
13
14 inline void init_io() {
15#ifdef _WIN32
16 // Windows: locale ".UTF-8" é válido
17 std::locale::global(std::locale(".UTF-8"));
18 SetConsoleOutputCP(CP_UTF8);
19 SetConsoleCP(CP_UTF8);
20#else
21 // Linux: usar locale vazio "" → herda do ambiente (normalmente já UTF-8)
22 std::locale::global(std::locale(""));
23#endif
24 }
25
26 inline int ContaUTF8(const char* str) {
27 // contagem de caracteres (mas ícons podem ocupar mais espaço)
28 unsigned int count = 0;
29 if (!str)
30 return 0;
31 while (*str) {
32 if ((*str & 0xC0) != 0x80)
33 count++;
34 str++;
35 }
36 return count;
37
38 // possibilidade de contar com tamanho dos ícons, a explorar no futuro:
39 int colunas = 0;
40 mbstate_t state{};
41 wchar_t wc;
42 size_t len;
43
44 while ((len = mbrtowc(&wc, str, MB_CUR_MAX, &state)) > 0) {
45#ifdef _WIN32
46 // Simplificação: ASCII=1, outros=2
47 colunas += (wc < 128 ? 1 : 2);
48#else
49 int w = wcwidth(wc);
50 colunas += (w > 0 ? w : 0);
51#endif
52 str += len;
53 }
54 return colunas;
55 }
56
57
58#define ICON_LISTA \
59 X(INST, "📄 ") /* instância / dados */ \
60 X(EXP, "🔍 ") /* explorar */ \
61 X(PARAM, "⚙ ") /* parâmetros */ \
62 X(SOL, "✔ ") /* solução */ \
63 X(IND, "⚖ ") /* indicadores */ \
64 X(EXEC, "► ") /* execução (início) */ \
65 X(FIM, "🏁 ") /* execução (fim) */ \
66 X(CONF, "🛠️ ") /* configuração */ \
67 X(TESTE, "🧪 ") /* teste */ \
68 X(TEMPO, "⏱ ") /* tempo utilizado */ \
69 X(RESULT, "📑 ") /* resultado / ficheiro */ \
70 X(PROCESSO, "🖥️ ") /* processo / computador */ \
71 X(TAREFA, "📋 ") /* tarefa */ \
72 X(TAXA, "📊 ") /* taxa / resultado */ \
73 X(SUCESSO, "🎯 ") /* objetivo alcançado, sucesso */ \
74 X(INSUC, "🚫 ") /* insucesso, objetivo não alcançado */ \
75 X(MEMORIA, "💾 ") /* estado em memória ou erro de memória (alternativa: 💾) */ \
76 X(IMP, "⛔ ") /* impossível, sem solução */ \
77 X(VALOR, "💰 ") /* valor/custo da solução */ \
78 X(SEL, "✓ ") /* valor ativo / selecionado */ \
79 X(NSEL, "✗ ") /* valor inativo / não selecionado */ \
80 X(FOLHA, "🍃 ") /* folha - nó folha numa árvore*/ \
81 X(LIMITE, "🪜 ") /* limite, profundidade de procura */ \
82 X(UB, "📈 ") /* upper bound / melhorar (dois contextos) */ \
83 X(LB, "📉 ") /* lower bound / a descer (dois contextos) */ \
84 X(ID, "🔖 ") /* identificador do estado, ID */ \
85 X(ACCAO, "⚡ ") /* ação, movimento, jogada, lance */ \
86 X(ARVORE, "🌳 ") /* árvore de procura, iteração (algoritmo iterativo) */ \
87 X(CORTE, "🪓 ") /* corte / poda da árvore de procura */ \
88 X(VIT_PRETA, "☖ ") /* vitória preta */ \
89 X(VIT_BRANCA, "☗ ") /* vitória branca */ \
90 X(EMPATE, "🟰 ") /* empate */ \
91 X(EPOCA, "📆 ") /* época */ \
92 X(DIST, "📏 ") /* distância entre dois elementos */ \
93 X(ELEMENTO, "🧍 ") /* elemento, pessoa, indivíduo */ \
94 X(POP, "🧍🧑‍🤝‍🧑🚶‍") /* população */ \
95 X(DIVERSIDADE, "🌈 ") /* diversidade */ \
96 X(SEL_PAIS, "🧩 ") /* fase algoritmo evolutivo, selecionar pais */ \
97 X(PAIS, "🧑‍🤝‍🧑 ") /* pais, do operador de cruzamento */ \
98 X(CRUZAR, "🧬 ") /* cruzamento, reprodução */ \
99 X(MUTAR, "🦠 ") /* mutação */ \
100 X(SOBREVIVENCIA, "⚔️ ") /* fase da sobrevivência algoritmo evolutivo */ \
101 X(IDADE, "⏳ ") /* idade de um elemento/indivíduo */ \
102 X(IMIGRANTES, "🚶‍ ") /* elementos / indivíduos imigrantes, estrangeiros */ \
103 X(APAGADO, "🧹 ") /* removido / apagado / eliminado / limpo */ \
104 X(ELITE, "👑 ") /* elite */ \
105 X(TORNEIO, "🏆 ") /* torneio */ \
106 X(VIZINHO, "🧍🧍") /* vizinho, operador de vizinhança */ \
107 X(MENU, "☰ ") /* menu */
108
109 enum class EIcon {
110#define X(nome, string) nome,
112#undef X
113 };
114
115 inline const char* Icon(EIcon icon) {
116 switch (icon) {
117#define X(nome, string) case EIcon::nome: return string;
119#undef X
120 }
121 return "";
122 }
123
124} // namespace compat
125
126// este tipo e função ficam disponíveis sem necessidade de colocar compact::
127using compat::EIcon;
128using compat::Icon;
const char * Icon(EIcon icon)
Definition compact.h:115
int ContaUTF8(const char *str)
Definition compact.h:26
void init_io()
Definition compact.h:14