代码很简单,写了一些注释;加上注释看就很清楚了。
文件bloomfilter.cpp:
1 #include "bloomfilter.h" 2 3 // return a hash range from 0 to 79999 4 int hash(const char* str, int index) 5 { 6 int hash = 1; 7 int seed = 12345; 8 int curr; 9 switch(index) 10 { 11 case 0:{ 12 while(curr = int(*str++)) 13 { 14 hash = 128 * hash + curr; 15 } 16 return abs(hash%80000); 17 } 18 case 1:{ 19 while(curr = int(*str++)) 20 { 21 hash = (25536 * hash + curr)%80000; 22 } 23 return abs(hash); 24 } 25 case 2:{ 26 while(curr = int(*str++)) 27 { 28 hash = (seed * hash + curr)%80000; 29 seed *= 123; 30 } 31 return abs(hash); 32 } 33 case 3:{ 34 while(curr = int(*str++)) 35 { 36 hash += curr*curr; 37 } 38 return abs(hash%80000); 39 } 40 case 4:{ 41 while(curr = int(*str++)) 42 { 43 hash += abs(curr*curr*curr); 44 } 45 return abs(hash%80000); 46 } 47 case 5:{ 48 while(curr = int(*str++)) 49 { 50 hash *= (hash + curr*seed)%80000; 51 } 52 return abs(hash%80000); 53 } 54 case 6:{ 55 while(curr = int(*str++)) 56 { 57 seed = 345; 58 hash = (seed * hash + curr)%80000; 59 seed *= 345; 60 } 61 return abs(hash); 62 } 63 } 64 return -1; 65 } 66 67 void initBitMap(unsigned char* bitMap) 68 { 69 for(int i = 0; i<10000;i++) 70 { 71 bitMap[i] = 0; 72 } 73 } 74 75 bool isKeyExistInBitMap(unsigned char* bitMap, const char* str) 76 { 77 for(int i = 0; i<7; i++) 78 { 79 int code = hash(str, i); 80 if(!((bitMap[code/8] >> code%8) % 2)) 81 { 82 return false; 83 } 84 } 85 return true; 86 } 87 88 void appendKey2BitMap(unsigned char* bitMap, const char* str) 89 { 90 if(isKeyExistInBitMap(bitMap, str)) 91 { 92 return; 93 } 94 for(int i = 0; i<7; i++) 95 { 96 int code = hash(str, i); 97 if(!((bitMap[code/8] >> code%8) % 2)) 98 { 99 bitMap[code/8] += 1 << code%8; 100 } 101 } 102 }
文件bloomfilter.h:
1 #ifndef BLOOMFILTER_H 2 #define BLOOMFILTER_H 3 4 #include <stdio.h> 5 #include <math.h> 6 7 int hash(const char* str, int index); 8 void initBitMap(unsigned char* bitMap); 9 bool isKeyExistInBitMap(unsigned char* bitMap, const char* str); 10 void appendKey2BitMap(unsigned char* bitMap, const char* str); 11 12 #endif // BLOOMFILTER_H
文件main.cpp:
1 #include "mainwindow.h" 2 #include <QApplication> 3 4 int main(int argc, char *argv[]) 5 { 6 QApplication a(argc, argv); 7 MainWindow w; 8 /*w.show();*/ 9 QIcon icon("E:/code/Qt/build-TangTang-DFZ-Release/release/th.jpg"); 10 w.setWindowIcon(icon); 11 w.setWindowTitle("Simple Code Editor"); 12 w.show(); 13 14 return a.exec(); 15 }
文件mainwindow.cpp:
1 #include "mainwindow.h" 2 #include "ui_mainwindow.h" 3 4 #include <QSyntaxHighlighter> 5 #include <QPushButton> 6 #include <QObject> 7 #include <QTextEdit> 8 #include "myhighlight.h" 9 10 MainWindow::MainWindow(QWidget *parent) : 11 QMainWindow(parent), 12 ui(new Ui::MainWindow) 13 { 14 ui->setupUi(this); 15 QFont font; 16 font.setFamily("Consolas"); 17 font.setFixedPitch(true); 18 font.setPointSize(20); 19 20 editor = new QTextEdit; 21 editor->setFont(font); 22 23 highlighter = new myHighLight(editor->document()); 24 25 setCentralWidget(editor); 26 setWindowTitle("Simple C++ Code Editor"); 27 28 connect(ui->actionappend_key, &QAction::triggered, this, &MainWindow::appendKey); 29 connect(ui->actionDelete_key, &QAction::triggered, this, &MainWindow::deleteKey); 30 } 31 32 MainWindow::~MainWindow() 33 { 34 delete editor; 35 delete ui; 36 } 37 38 void MainWindow::appendKey() 39 { 40 QString selectedText = editor->textCursor().selectedText(); 41 highlighter->appendKey(selectedText); 42 highlighter->setDocument(editor->document()); 43 } 44 45 void MainWindow::deleteKey() 46 { 47 QString selectedText = editor->textCursor().selectedText(); 48 highlighter->deleteKey(selectedText); 49 highlighter->setDocument(editor->document()); 50 }
文件mainwindow.h:
1 #ifndef MAINWINDOW_H 2 #define MAINWINDOW_H 3 4 #include <QMainWindow> 5 #include "myhighlight.h" 6 #include <QTextEdit> 7 #include <QtCore> 8 9 namespace Ui { 10 class MainWindow; 11 } 12 13 class MainWindow : public QMainWindow 14 { 15 Q_OBJECT 16 17 public: 18 explicit MainWindow(QWidget *parent = 0); 19 ~MainWindow(); 20 21 private slots: 22 // append selected text for ui 23 void appendKey(); 24 void deleteKey(); 25 26 private: 27 Ui::MainWindow *ui; 28 29 QTextEdit *editor; 30 myHighLight *highlighter; 31 }; 32 33 #endif // MAINWINDOW_H
文件mainwindow.ui自己拖一拖就行!
文件myhighlight.cpp:
1 #include "myhighlight.h" 2 #include "bloomfilter.cpp" 3 #include <QtGui> 4 5 myHighLight::myHighLight(QTextDocument *parent) 6 : QSyntaxHighlighter(parent) 7 { 8 // find each word 9 rule = new QRegExp("(\\b)(\\w+)(\\b)"); 10 11 format.setForeground(Qt::blue); 12 format.setFontWeight(QFont::Bold); 13 14 initBitMap(bitMap); 15 QStringList keyWords = cppKeyword(); 16 for(QString key : keyWords) 17 { 18 appendKey(key); 19 } 20 } 21 22 myHighLight::~myHighLight() 23 { 24 if(rule) 25 delete rule; 26 } 27 28 QStringList myHighLight::cppKeyword() 29 { 30 return QStringList()<<"asm"<<"auto"<<"bool"<<"break"<<"case"<<"catch"<<"char" 31 <<"class"<<"const"<<"const_cast"<<"continue"<<"default"<<"delete" 32 <<"do"<<"double"<<"dynamic_cast"<<"else"<<"enum"<<"explicit" 33 <<"export"<<"extern"<<"false"<<"float"<<"for"<<"friend"<<"goto" 34 <<"if"<<"inline"<<"int"<<"long"<<"mutable"<<"namespace"<<"new" 35 <<"operator"<<"private"<<"protected"<<"public"<<"register" 36 <<"reinterpret_cast"<<"return"<<"short"<<"signed"<<"sizeof"<<"static" 37 <<"static_cast"<<"struct"<<"switch"<<"template"<<"this"<<"throw" 38 <<"true"<<"try"<<"typedef"<<"typeid"<<"typename"<<"union"<<"unsigned" 39 <<"using"<<"virtual"<<"void"<<"volatile"<<"wchar_t"<<"while"; 40 } 41 42 //QVector<int> myHighLight::Hash(QString word) 43 //{ 44 // std::hash<std::string> str_hash; 45 // QVector<int> res; 46 // if(word.size()%hashCount == 0) 47 // { 48 // word += " "; 49 // } 50 // QString key; 51 // while(key.size() < 100) 52 // { 53 // key += word; 54 // } 55 56 // for(int i = 0; i<hashCount; i++) 57 // { 58 // QString key0; 59 // for(int j = i;j<key.size(); j+=hashCount) 60 // { 61 // key0.append(key[j]); 62 // } 63 // res.append(abs(int(str_hash(key0.toStdString()))%(BloomFilter.size()*8-1))); 64 // } 65 66 // return res; 67 //} 68 69 void myHighLight::appendKey(QString key) 70 { 71 if(!rule->exactMatch(key)) 72 { 73 qDebug()<<"KeyWord "<<key<<" is not a word"; 74 return; 75 } 76 77 if(whiteNameList.contains(key)) 78 { 79 whiteNameList.removeOne(key); 80 } 81 82 appendKey2BitMap(bitMap, key.toStdString().data()); 83 // if(isKeyExisted(key)) 84 // { 85 // qDebug()<<"KeyWord "<<key<<" alredy existed!"; 86 // return; 87 // } 88 89 // QVector<int> hash = Hash(key); 90 // for(auto code : hash) 91 // { 92 // if(!((BloomFilter[code/8] >> code%8) % 2)) 93 // { 94 // BloomFilter[code/8] += 1 << code%8; 95 // } 96 // } 97 } 98 99 void myHighLight::deleteKey(QString key) 100 { 101 if(!rule->exactMatch(key)) 102 { 103 qDebug()<<"KeyWord "<<key<<" is not a word"; 104 return; 105 } 106 107 if(whiteNameList.contains(key)) 108 { 109 qDebug()<<"KeyWord "<<key<<" to be deleted has already been in whitelist"; 110 return; 111 } 112 113 if(!isKeyExisted(key)) 114 { 115 qDebug()<<"KeyWord "<<key<<" to be deleted is not in the BloomFilter!"; 116 return; 117 } 118 119 whiteNameList.push_back(key); 120 qDebug()<<whiteNameList; 121 } 122 123 bool myHighLight::isKeyExisted(QString key) 124 { 125 if(whiteNameList.contains(key)) 126 { 127 return false; 128 } 129 130 return isKeyExistInBitMap(bitMap, key.toStdString().data()); 131 // QVector<int> hash = Hash(key); 132 // for(auto code : hash) 133 // { 134 // if(!((BloomFilter[code/8] >> code%8) % 2)) 135 // { 136 // return false; 137 // } 138 // } 139 // return true; 140 } 141 142 void myHighLight::highlightBlock(const QString &text) 143 { 144 int index = rule->indexIn(text); 145 while(index >= 0) 146 { 147 int length = rule->matchedLength(); 148 if(isKeyExisted(text.mid(index, length))) 149 { 150 setFormat(index, length, format); 151 } 152 index = rule->indexIn(text, index + length); 153 } 154 }
文件myhighlight.h:
1 #ifndef MYHIGHLIGHT_H 2 #define MYHIGHLIGHT_H 3 4 #include <QSyntaxHighlighter> 5 #include <QTextCharFormat> 6 7 class QTextDocument; 8 9 class myHighLight : public QSyntaxHighlighter 10 { 11 Q_OBJECT 12 public: 13 myHighLight(QTextDocument *parent = 0); 14 ~myHighLight(); 15 16 static QStringList cppKeyword(); 17 18 // get a Hash Value Array from a word 19 QVector<int> Hash(QString word); 20 // append a keyword to the bloom filter 21 void appendKey(QString key); 22 // delete a keyword from the bloom filter 23 void deleteKey(QString key); 24 // judge if the word is existing in the bloom filter 25 bool isKeyExisted(QString key); 26 27 protected: 28 // highlight the keyword block on updating document 29 void highlightBlock(const QString &text); 30 31 private: 32 // regression expression for searching every words 33 QRegExp* rule; 34 // the format we plan to apply in keyword 35 QTextCharFormat format; 36 37 // the structure to store keywords. it is expected to store 8000 words in total. 38 // More details in program report. 39 unsigned char bitMap[10000]; 40 // QVector<unsigned char> BloomFilter; 41 // each keyword in the whitelist is considered not to be in the BloomFilter 42 QVector<QString> whiteNameList; 43 44 // // the hash function count. 7 is best for 1% error possibility 45 // const int hashCount = 7; 46 }; 47 48 #endif // MYHIGHLIGHT_H
原文地址:https://www.cnblogs.com/25th-engineer/p/9784588.html
时间: 2024-12-10 14:21:55