首页 > 其他 > 详细

格式化stl复杂声明

时间:2016-01-23 23:08:32      阅读:325      评论:0      收藏:0      [点我收藏+]

  今天用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开发,不如试一下,效果如下:

  格式化之前:

技术分享

  格式化之后:

技术分享

 

 凑合能用吧

 

格式化stl复杂声明

原文:http://www.cnblogs.com/SillyFlame/p/5154266.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!