Advertisement
Guest User

Untitled

a guest
Jan 18th, 2022
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.65 KB | None | 0 0
  1. // Один из двух случаев:
  2. // - valid = true и value содержит осмысленный результат
  3. // - valid = false и value может быть любым
  4.  
  5. typedef struct
  6. {
  7.     bool valid;
  8.     int64_t value;
  9. } maybe_int64;
  10.  
  11. // Первый случай; создаем функцию в помощь
  12. // Не бойтесь за производительность
  13. maybe_int64 some_int64(int64_t i)
  14. {
  15.     return (maybe_int64){.value = i, .valid = true};
  16. }
  17.  
  18. // Второй случай; можно создать не функцию,
  19. // а константный экземпляр структуры
  20. // Все поля инициализированы нулями
  21. // .value = 0, .valid = false
  22. const maybe_int64 none_int64 = {0};
  23.  
  24. // упакованное число 42 выводится как "Some 42"
  25. // Ошибка выводится как None
  26. void maybe_int64_print(maybe_int64 i)
  27. {
  28.     if (i.valid)
  29.     {
  30.         printf("Some %d", i.value);
  31.     }
  32.     else
  33.     {
  34.         printf("None");
  35.     }
  36. }
  37.  
  38. // Если обе упаковки содержат ошибку, то результат ошибка
  39. // Если ровно одна упаковка содержит ошибку, то результат -- вторая
  40. // Если обе упаковки содержат число, то результат это минимум из двух чисел.
  41. maybe_int64 maybe_int64_min(maybe_int64 a, maybe_int64 b)
  42. {
  43.     if (a.valid && b.valid)
  44.     {
  45.         return a.value < b.value ? a : b;
  46.     }
  47.     if (a.valid ^ b.valid)
  48.     {
  49.         return a.valid ? a : b;
  50.     }
  51.     return none_int64;
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement