10225501448 李度 10225101546 陈胤遒 10215501422 高宇菲
Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 

96 рядки
2.5 KiB

#include "util/serialize_value.h"
#include <algorithm>
#include <string>
#include "util/coding.h"
#include <iostream>
namespace leveldb{
bool compareByFirst(const Field& a, const Field& b) {
return a.first < b.first; // 按字段名升序排序
}
std::string SerializeValue(const FieldArray& fields){
FieldArray sortFields = fields;
std::sort(sortFields.begin(), sortFields.end(), compareByFirst);
std::string result;
for (const Field& pairs : sortFields) {
PutLengthPrefixedSlice(&result, pairs.first);
PutLengthPrefixedSlice(&result, pairs.second);
}
return result;
}
FieldArray *ParseValue(const std::string& value_str,FieldArray *fields){
Slice valueSlice(value_str);
// FieldArray *res = new FieldArray;
FieldArray *res = fields;
Slice nameSlice = Slice();
Slice valSlice = Slice();
std::string nameStr;
std::string valStr;
while(GetLengthPrefixedSlice(&valueSlice, &nameSlice)){
nameStr = nameSlice.ToString();
if(GetLengthPrefixedSlice(&valueSlice, &valSlice)){
valStr = valSlice.ToString();
res->emplace_back(nameStr, valStr);
} else {
std::cout << "name and val not match! From ParseValue" << std::endl;
assert(0);
}
nameSlice.clear();
valSlice.clear();
}
return res;
}
void InternalFieldArray::Map() {
if(isMapped) return;
for(const Field& pair : fields) {
map[pair.first] = pair.second;
}
isMapped = true;
}
std::string InternalFieldArray::Serialize() {
std::string result;
if(isMapped) {
for(auto pair : map) {
PutLengthPrefixedSlice(&result, pair.first);
PutLengthPrefixedSlice(&result, pair.second);
}
} else {
result = SerializeValue(fields);
}
return result;
}
bool InternalFieldArray::HasField(const Field& field) {
if(isMapped) {
if(map.count(field.first) && map[field.first] == field.second) {
return true;
}
return false;
}
return std::find(fields.begin(),fields.end(),field) != fields.end();
}
std::string InternalFieldArray::ValOfName(const std::string &name) {
if(isMapped) {
if(map.count(name)) {
return map[name];
}
return std::string();
}
for (auto iter = fields.begin(); iter != fields.end(); iter++){
if (iter->first == name) {
return iter->second;
} else if (iter->first > name) {
return std::string();
}
}
return std::string();
}
}