30namespace fs = boost::filesystem;
34 auto rbeg =
rev(identifier.
sz + identifier.
len);
37 auto rend =
rev(identifier.
sz);
39 for (++rbeg; rbeg != rend; ++rbeg)
46 CppToken clsName {identifier.
sz,
static_cast<size_t>(std::distance(rbeg, rend)) - 1};
50 else if (*rbeg ==
'>')
61 if (identifier.
sz ==
nullptr)
64 if (identifier.
sz[identifier.
len - 1] ==
'>')
67 const char* scopeResolutor =
"::";
68 const char* end = identifier.
sz + identifier.
len;
69 auto itr = std::find_end(identifier.
sz, end, scopeResolutor, scopeResolutor + 2);
73 for (itr = itr + 2; (itr != end) && !isprint(*itr); ++itr)
75 const auto clsNameLen =
static_cast<size_t>(end - itr);
79std::string
readFile(
const std::string& filename)
82 std::ifstream in(filename, std::ios::in | std::ios::binary);
85 in.seekg(0, std::ios::end);
86 size_t size =
static_cast<size_t>(in.tellg());
87 contents.resize(size + 3);
88 in.seekg(0, std::ios::beg);
89 in.read(contents.data(), size);
91 auto len =
stripChar(contents.data(), size,
'\r');
93 contents.resize(len + 3);
95 contents[len + 1] =
'\0';
96 contents[len + 2] =
'\0';
103 if (fs::is_regular_file(path))
105 auto file = path.string();
106 if (fileSelector(file))
107 files.push_back(std::move(file));
109 else if (fs::is_directory(path))
111 for (fs::directory_iterator dirItr(path); dirItr != fs::directory_iterator(); ++dirItr)
118 std::sort(files.begin(), files.end());
123 auto const delimLen = strlen(delim);
124 std::vector<CppToken> elems;
126 for (
auto* p = token.
sz; p < (token.
sz + token.
len);)
128 auto* q = strstr(p, delim);
131 elems.push_back(
CppToken {p,
static_cast<size_t>(q - p)});
136 elems.push_back(
CppToken {p,
static_cast<size_t>(token.
sz + token.
len - p)});
147 for (
size_t i = 0; i < identifier.
len; ++i)
149 if (isprint(identifier.
sz[i]))
150 ret += identifier.
sz[i];
std::function< bool(const std::string &)> CppProgFileSelecter
size_t stripChar(char *s, size_t len, char c)
static CppToken classNameFromTemplatedIdentifier(const CppToken &identifier)
CppToken classNameFromIdentifier(const CppToken &identifier)
std::vector< CppToken > explode(CppToken token, const char *delim)
std::string pruneClassName(const CppToken &identifier)
void collectFiles(std::vector< std::string > &files, const fs::path &path, const CppProgFileSelecter &fileSelector)
std::string readFile(const std::string &filename)
std::reverse_iterator< Iter > rev(Iter i)