格式化stl复杂声明

  今天用vs调试程序,想看看各个函数耗费时间,结果发现某些函数声明竟然长这样:

std::vector<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int>,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,int> > >::emplace_back<char const (&)[5],int &>

  而且我刚好又想看看这些个声明的结构,就想写个C++小程序,格式化输出这个声明,效果如下:

std::vector
<
    std::pair
    <
        std::basic_string
        <
            char,std::char_traits<char>,
            std::allocator<char> 
        >,
        int
    >,
    std::allocator
    <
        std::pair
        <
            std::basic_string
            <
                char,std::char_traits<char>,
                std::allocator<char> 
            >,
            int
        > 
    > 
>::emplace_back
<
    char const (&)[5],int &
>

这样就好理解多了,而且对于stl源码就够也很清晰了。

  具体代码:

#include <fstream>
#include <iostream>
#include <memory>
#include <string>
#include <algorithm>

using namespace std;

const int tabCount = 4;

void putTable(std::string & newContent,int level) {
    for (int i = 0; i < level; ++i) {
        for (int j = 0; j < tabCount; ++j) {
            newContent.push_back(' ');
        }
    }
}

void putLine(std::string & newContent) {
    newContent.push_back('\n');
}

void putChar(std::string & newContent, char c) {
    newContent.push_back(c);
}

int main(int argc, char **argv) {
    
    if (argc <= 1) {
        std::cout << "usage: formatStl filename" << endl;
        return 1;
    }
    std::cout << argv[1] << endl;
    fstream inputFile;
    inputFile.open(argv[1], fstream::in);
    if (inputFile.fail()) {
        std::cout << "open file error\n";
    }

    inputFile.seekg(0, inputFile.end);
    int length = inputFile.tellg();
    inputFile.seekg(0, inputFile.beg);
    ++length;

    char * buffer = new char[length];
    if (!buffer) {
        std::cout << "new buffer failed!" << endl;
    }
    memset(buffer, 0, length);
    inputFile.read(buffer, length-1);

    std::string newContent;
    char *begen = buffer;
    char *end = buffer + length - 1;

    if (inputFile) {
        char * cur = buffer;
        int level = 0;

        while (*cur != 0) {
            
            if (*cur == '<') {
                auto it_r = find(cur, end, '>');
                auto it_l = find(cur + 1, end, '<');
                if (it_r < it_l) {
                    while (cur <= it_r) {
                        putChar(newContent, *cur);
                        ++cur;
                    }
                    continue;
                }else{
                    putLine(newContent);
                    putTable(newContent, level);
                    putChar(newContent, *cur);
                    putLine(newContent);
                    ++level;
                    putTable(newContent, level);
                }
            }
            else if (*cur == '>') {
                --level;
                putLine(newContent);
                putTable(newContent, level);
                putChar(newContent, *cur);
            }
            else if (*cur == ',') {
                putChar(newContent, *cur);
                if (*(cur - 1) == '>') {
                    putLine(newContent);
                    putTable(newContent, level);
                }
            }
            else {
                putChar(newContent, *cur);
            }

            ++cur;
        }

        std::cout << newContent << endl;
    }
    else {
        std::cout << "error: only " << inputFile.gcount() << " could be read";
    }


    delete[] buffer;

    std::cout << "exit!" << endl;
    return 0;
}

  后来发现,这样也还是很麻烦啊,每次还要保存到一个文件,再去运行这个程序,不是很扯淡么?

  正好最近在用sublime,直接做个插件行不行,网上搜了下教程,发现好像不是很复杂,用python开发,不如试一下,效果如下:

  格式化之前:

  格式化之后:

 

 凑合能用吧

 

posted @ 2016-01-23 22:42  SillyFlame  阅读(239)  评论(0编辑  收藏  举报