File: transform_snake_case.hpp

package info (click to toggle)
reflect-cpp 0.18.0%2Bds-3
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 12,524 kB
  • sloc: cpp: 44,484; python: 131; makefile: 30; sh: 3
file content (55 lines) | stat: -rw-r--r-- 1,527 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#ifndef RFL_INTERNAL_TRANSFORMSNAKECASE_HPP_
#define RFL_INTERNAL_TRANSFORMSNAKECASE_HPP_

#include "StringLiteral.hpp"

namespace rfl::internal {

/// Capitalizes a lower-case character.
template <char c>
consteval char to_upper() {
  if constexpr (c >= 'a' && c <= 'z') {
    return c + ('A' - 'a');
  } else {
    return c;
  }
}

template <char c>
consteval char to_lower() {
  if constexpr (c >= 'A' && c <= 'Z') {
    return c - ('A' - 'a');
  } else {
    return c;
  }
}

/// Transforms the field name from snake case to camel case.
template <internal::StringLiteral _name, bool _capitalize, size_t _i = 0,
          char... chars>
consteval auto transform_snake_case() {
  if constexpr (_i == _name.arr_.size()) {
    return StringLiteral<sizeof...(chars) + 1>(chars...);

  } else if constexpr (_name.arr_[_i] == '_') {
    return transform_snake_case<_name, true, _i + 1, chars...>();

  } else if constexpr (_name.arr_[_i] == '\0') {
    return transform_snake_case<_name, false, _name.arr_.size(), chars...>();

  } else if constexpr (_capitalize) {
    return transform_snake_case<_name, false, _i + 1, chars...,
                                to_upper<_name.arr_[_i]>()>();

  } else if constexpr (sizeof...(chars) == 0) {
    return transform_snake_case<_name, false, _i + 1,
                                to_lower<_name.arr_[_i]>()>();

  } else {
    return transform_snake_case<_name, false, _i + 1, chars...,
                                _name.arr_[_i]>();
  }
}
}  // namespace rfl::internal

#endif