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