1
0
Fork 0

Merge branch 'devel' of github.com:triAGENS/ArangoDB into devel

This commit is contained in:
Esteban Lombeyda 2014-04-01 08:40:18 +02:00
commit a38d43a450
12 changed files with 377 additions and 61 deletions

View File

@ -0,0 +1,217 @@
////////////////////////////////////////////////////////////////////////////////
/// @brief test suite for TRI_associative_multi_pointer_t
///
/// @file
///
/// DISCLAIMER
///
/// Copyright 2012 triagens GmbH, Cologne, Germany
///
/// Licensed under the Apache License, Version 2.0 (the "License");
/// you may not use this file except in compliance with the License.
/// You may obtain a copy of the License at
///
/// http://www.apache.org/licenses/LICENSE-2.0
///
/// Unless required by applicable law or agreed to in writing, software
/// distributed under the License is distributed on an "AS IS" BASIS,
/// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
/// See the License for the specific language governing permissions and
/// limitations under the License.
///
/// Copyright holder is triAGENS GmbH, Cologne, Germany
///
/// @author Max Neunhoeffer
/// @author Copyright 2014, triAGENS GmbH, Cologne, Germany
////////////////////////////////////////////////////////////////////////////////
#include <boost/test/unit_test.hpp>
#include "BasicsC/associative-multi.h"
#include "BasicsC/hashes.h"
#include "BasicsC/tri-strings.h"
#include "BasicsC/conversions.h"
#include <vector>
using namespace std;
// -----------------------------------------------------------------------------
// --SECTION-- private macros
// -----------------------------------------------------------------------------
#define INIT_MULTI \
TRI_multi_pointer_t a1; \
TRI_InitMultiPointer(&a1, TRI_CORE_MEM_ZONE, HashKey, HashElement, IsEqualKeyElement, IsEqualElementElement);
#define DESTROY_MULTI \
TRI_DestroyMultiPointer(&a1);
#define ELEMENT(name, v, k) \
data_container_t name; \
name.key = k; \
name.value = v;
struct data_container_t {
int value;
int key;
data_container_t () : value(0), key(0) {};
data_container_t (int key, int value) : value(value), key(key) {};
};
static uint64_t HashKey (TRI_multi_pointer_t* a, void const* e) {
int const* key = (int const*) e;
return TRI_FnvHashPointer(key,sizeof(int));
}
static uint64_t HashElement (TRI_multi_pointer_t* a, void const* e, bool byKey) {
data_container_t const* element = (data_container_t const*) e;
if (byKey) {
return TRI_FnvHashPointer(&element->key,sizeof(element->key));
}
else {
return TRI_FnvHashPointer(&element->value,sizeof(element->value));
}
}
static bool IsEqualKeyElement (TRI_multi_pointer_t* a, void const* k, void const* r) {
int const* key = (int const*) k;
data_container_t const* element = (data_container_t const*) r;
return *key == element->key;
}
static bool IsEqualElementElement (TRI_multi_pointer_t* a, void const* l, void const* r, bool byKey) {
data_container_t const* left = (data_container_t const*) l;
data_container_t const* right = (data_container_t const*) r;
if (byKey) {
return left->key == right->key;
}
else {
return left->value == right->value;
}
}
// -----------------------------------------------------------------------------
// --SECTION-- private constants
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// --SECTION-- setup / tear-down
// -----------------------------------------------------------------------------
struct CMultiPointerSetup {
CMultiPointerSetup () {
BOOST_TEST_MESSAGE("setup TRI_associative_pointer_t");
}
~CMultiPointerSetup () {
BOOST_TEST_MESSAGE("tear-down TRI_associative_pointer_t");
}
};
// -----------------------------------------------------------------------------
// --SECTION-- test suite
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief setup
////////////////////////////////////////////////////////////////////////////////
BOOST_FIXTURE_TEST_SUITE(CMultiPointerTest, CMultiPointerSetup)
////////////////////////////////////////////////////////////////////////////////
/// @brief test initialisation
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_init) {
INIT_MULTI
BOOST_CHECK_EQUAL((uint64_t) 0, a1._nrUsed);
DESTROY_MULTI
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test unique insertion
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_insert_many_keys) {
INIT_MULTI
void* r = 0;
ELEMENT(e1, 1, 123);
BOOST_CHECK_EQUAL(r, TRI_InsertElementMultiPointer(&a1, &e1, true, false));
BOOST_CHECK_EQUAL((uint64_t) 1, a1._nrUsed);
BOOST_CHECK_EQUAL(&e1, TRI_LookupByElementMultiPointer(&a1, &e1));
BOOST_CHECK_EQUAL(&e1, TRI_RemoveElementMultiPointer(&a1, &e1));
BOOST_CHECK_EQUAL((uint64_t) 0, a1._nrUsed);
BOOST_CHECK_EQUAL(r, TRI_LookupByElementMultiPointer(&a1, &e1));
DESTROY_MULTI
}
#define NUMBER_OF_ELEMENTS 100
#define MODULUS 10
BOOST_AUTO_TEST_CASE (tst_insert_key_unique) {
INIT_MULTI
int i;
ELEMENT(e, 0, 0);
vector<data_container_t*> v;
data_container_t* n = 0;
data_container_t* p;
data_container_t* one_more;
// Put in some data:
for (i = 0;i < NUMBER_OF_ELEMENTS;i++) {
p = new data_container_t(i % MODULUS, i);
v.push_back(p);
BOOST_CHECK_EQUAL(n, TRI_InsertElementMultiPointer(&a1, p, true, false));
}
one_more = new data_container_t(NUMBER_OF_ELEMENTS % MODULUS,
NUMBER_OF_ELEMENTS);
// Now check it is there (by element):
for (i = 0;i < NUMBER_OF_ELEMENTS;i++) {
p = static_cast<data_container_t*>
(TRI_LookupByElementMultiPointer(&a1, v[i]));
BOOST_CHECK_EQUAL(p,v[i]);
}
// This should not be there:
p = static_cast<data_container_t*>
(TRI_LookupByElementMultiPointer(&a1, one_more));
BOOST_CHECK_EQUAL(n, p);
// Now check by key:
TRI_vector_pointer_t res;
for (i = 0;i < MODULUS;i++) {
}
// Pull down data again:
for (i = 0;i < NUMBER_OF_ELEMENTS;i++) {
delete v[i];
}
v.clear();
delete one_more;
DESTROY_MULTI
}
////////////////////////////////////////////////////////////////////////////////
/// @brief generate tests
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_SUITE_END ()
// Local Variables:
// mode: outline-minor
// outline-regexp: "^\\(/// @brief\\|/// {@inheritDoc}\\|/// @addtogroup\\|// --SECTION--\\|/// @\\}\\)"
// End:

View File

@ -71,96 +71,114 @@ BOOST_AUTO_TEST_CASE (tst_fnv64_simple) {
buffer = "";
BOOST_CHECK_EQUAL((uint64_t) 14695981039346656037ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 14695981039346656037ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 14695981039346656037ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = " ";
BOOST_CHECK_EQUAL((uint64_t) 12638117931323064703ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 12638117931323064703ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 12638117931323064703ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = " ";
BOOST_CHECK_EQUAL((uint64_t) 560038479724991597ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 560038479724991597ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 560038479724991597ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "a";
BOOST_CHECK_EQUAL((uint64_t) 12638187200555641996ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 12638187200555641996ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 12638187200555641996ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "A";
BOOST_CHECK_EQUAL((uint64_t) 12638222384927744748ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 12638222384927744748ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 12638222384927744748ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = " a";
BOOST_CHECK_EQUAL((uint64_t) 559967011469157882ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 559967011469157882ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 559967011469157882ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = " a ";
BOOST_CHECK_EQUAL((uint64_t) 14038824050427892078ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 14038824050427892078ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 14038824050427892078ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "a ";
BOOST_CHECK_EQUAL((uint64_t) 620373080799520836ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 620373080799520836ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 620373080799520836ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "A ";
BOOST_CHECK_EQUAL((uint64_t) 650913115778654372ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 650913115778654372ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 650913115778654372ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = " A";
BOOST_CHECK_EQUAL((uint64_t) 560002195841260634ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 560002195841260634ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 560002195841260634ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = " A ";
BOOST_CHECK_EQUAL((uint64_t) 14069504822895436622ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 14069504822895436622ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 14069504822895436622ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "0";
BOOST_CHECK_EQUAL((uint64_t) 12638135523509116079ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 12638135523509116079ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 12638135523509116079ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "1";
BOOST_CHECK_EQUAL((uint64_t) 12638134423997487868ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 12638134423997487868ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 12638134423997487868ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "11";
BOOST_CHECK_EQUAL((uint64_t) 574370613795883607ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 574370613795883607ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 574370613795883607ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "111";
BOOST_CHECK_EQUAL((uint64_t) 5002439360283388754ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 5002439360283388754ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 5002439360283388754ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "2";
BOOST_CHECK_EQUAL((uint64_t) 12638137722532372501ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 12638137722532372501ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 12638137722532372501ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "3";
BOOST_CHECK_EQUAL((uint64_t) 12638136623020744290ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 12638136623020744290ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 12638136623020744290ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "the quick brown fox jumped over the lazy dog";
BOOST_CHECK_EQUAL((uint64_t) 5742411339260295416ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 5742411339260295416ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 5742411339260295416ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "The Quick Brown Fox Jumped Over The Lazy Dog";
BOOST_CHECK_EQUAL((uint64_t) 11643291398347681368ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 11643291398347681368ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 11643291398347681368ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
}
////////////////////////////////////////////////////////////////////////////////
@ -173,51 +191,61 @@ BOOST_AUTO_TEST_CASE (tst_fnv64_utf8) {
buffer = "ジャパン は、イギリスのニュー・ウェーヴバンド。デヴィッド・ ... を構築していった。 日本では初来日でいきなり武道館での公演を行うなど、爆発的な人気を誇ったが、英国ではなかなか人気が出ず、初期は典型的な「ビッグ・イン・ジャパン」状態であった。日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。デヴィッド・シルヴィアンとその弟スティーヴ・ジャンセン、デヴィッドの親友であったミック・カーンを中心に結成。ミック・カーンの兄の結婚式にバンドとして最初のお披露目をした。当初はミック・カーンをリードボーカルとして練習していたが、本番直前になって怖じ気づいたミックがデヴィッド・シルヴィアンに無理矢理頼み込んでボーカルを代わってもらい、以降デヴィッドがリードボーカルとなった。その後高校の同級であったリチャード・バルビエリを誘い、更にオーディションでロブ・ディーンを迎え入れ、デビュー当初のバンドの形態となった。デビュー当初はアイドルとして宣伝されたグループだったが、英国の音楽シーンではほとんど人気が無かった。初期のサウンドは主に黒人音楽やグラムロックをポスト・パンク的に再解釈したものであったが、作品を重ねるごとに耽美的な作風、退廃的な歌詞やシンセサイザーの利用など独自のスタイルを構築していった。日本では初来日でいきなり武道館での公演を行うなど、爆発的な人気を誇ったが、英国ではなかなか人気が出ず、初期は典型的な「ビッグ・イン・ジャパン」状態であった。";
BOOST_CHECK_EQUAL((uint64_t) 211184911024797733ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 211184911024797733ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 211184911024797733ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "코리아닷컴 메일알리미 서비스 중단안내 [안내] 개인정보취급방침 변경 안내 회사소개 | 광고안내 | 제휴안내 | 개인정보취급방침 | 청소년보호정책 | 스팸방지정책 | 사이버고객센터 | 약관안내 | 이메일 무단수집거부 | 서비스 전체보기";
BOOST_CHECK_EQUAL((uint64_t) 270676307504294177ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 270676307504294177ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 270676307504294177ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "中华网以中国的市场为核心,致力为当地用户提供流动增值服务、网上娱乐及互联网服务。本公司亦推出网上游戏,及透过其门户网站提供包罗万有的网上产品及服务。";
BOOST_CHECK_EQUAL((uint64_t) 14670566365397374664ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 14670566365397374664ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 14670566365397374664ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "כפי שסופיה קופולה היטיבה לבטא בסרטה אבודים בטוקיו, בתי מלון יוקרתיים בערים גדולות אמנם מציעים אינספור פינוקים, אבל הם גם עלולים לגרום לנו להרגיש בודדים ואומללים מאי פעם. לעומת זאת, B&B, בתים פרטיים שבהם אפשר לישון ולאכול ארוחת בוקר, הם דרך נהדרת להכיר עיר אירופאית כמו מקומיים ולפגוש אנשים מרתקים מרחבי העולם. לטובת מי שנוסע לממלכה בחודשים הקרובים, הגרדיאן הבריטי קיבץ את עשרת ה-B&B המומלצים ביותר בלונדון. כל שנותר הוא לבחור, ולהזמין מראש";
BOOST_CHECK_EQUAL((uint64_t) 16145169633099782595ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 16145169633099782595ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 16145169633099782595ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "بان يأسف لمقتل لاجئين سوريين بتركيا المرزوقي يندد بعنف الأمن التونسي تنديد بقتل الجيش السوري مصورا تلفزيونيا 14 قتيلا وعشرات الجرحى بانفجار بالصومال";
BOOST_CHECK_EQUAL((uint64_t) 7398242043026945788ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 7398242043026945788ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 7398242043026945788ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "Голкипер мадридского «Реала» Икер Касильяс призвал своих партнеров сосредоточить все мысли на предстоящем дерби с «Атлетико»";
BOOST_CHECK_EQUAL((uint64_t) 10412552537249637418ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 10412552537249637418ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 10412552537249637418ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "   ";
BOOST_CHECK_EQUAL((uint64_t) 4095843978425089933ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 4095843978425089933ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 4095843978425089933ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "अ आ इ ई उ ऊ ऋ ॠ ऌ ॡ ए ऐ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह";
BOOST_CHECK_EQUAL((uint64_t) 2927729442665428350ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 2927729442665428350ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 2927729442665428350ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "tɜt kɐː mɔj ŋɨɜj siŋ za ɗew ɗɨɜk tɨɰ zɔ vɐː ɓiŋ ɗɐŋ vej ɲɜn fɜm vɐː kɨɜn. mɔj kɔn ŋɨɜj ɗeu ɗɨɜk tɐːw huɜ ɓɐːn cɔ li ci vɐː lɨɜŋ tɜm vɐː kɜn fɐːj ɗoj sɨ vɜj ɲɐw cɔŋ tiŋ ɓɐŋ hɨw.";
BOOST_CHECK_EQUAL((uint64_t) 15359789603011345030ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 15359789603011345030ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 15359789603011345030ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
buffer = "äöüßÄÖÜ€µ";
BOOST_CHECK_EQUAL((uint64_t) 2954195900047086928ULL, TRI_FnvHashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 2954195900047086928ULL, TRI_FnvHashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 2954195900047086928ULL, TRI_FnvHashBlock(TRI_FnvHashBlockInitial(), buffer.c_str(), strlen(buffer.c_str())));
}
////////////////////////////////////////////////////////////////////////////////
@ -332,51 +360,61 @@ BOOST_AUTO_TEST_CASE (tst_crc32_utf8) {
buffer = "ジャパン は、イギリスのニュー・ウェーヴバンド。デヴィッド・ ... を構築していった。 日本では初来日でいきなり武道館での公演を行うなど、爆発的な人気を誇ったが、英国ではなかなか人気が出ず、初期は典型的な「ビッグ・イン・ジャパン」状態であった。日本最大級のポータルサイト。検索、オークション、ニュース、メール、コミュニティ、ショッピング、など80以上のサービスを展開。あなたの生活をより豊かにする「ライフ・エンジン」を目指していきます。デヴィッド・シルヴィアンとその弟スティーヴ・ジャンセン、デヴィッドの親友であったミック・カーンを中心に結成。ミック・カーンの兄の結婚式にバンドとして最初のお披露目をした。当初はミック・カーンをリードボーカルとして練習していたが、本番直前になって怖じ気づいたミックがデヴィッド・シルヴィアンに無理矢理頼み込んでボーカルを代わってもらい、以降デヴィッドがリードボーカルとなった。その後高校の同級であったリチャード・バルビエリを誘い、更にオーディションでロブ・ディーンを迎え入れ、デビュー当初のバンドの形態となった。デビュー当初はアイドルとして宣伝されたグループだったが、英国の音楽シーンではほとんど人気が無かった。初期のサウンドは主に黒人音楽やグラムロックをポスト・パンク的に再解釈したものであったが、作品を重ねるごとに耽美的な作風、退廃的な歌詞やシンセサイザーの利用など独自のスタイルを構築していった。日本では初来日でいきなり武道館での公演を行うなど、爆発的な人気を誇ったが、英国ではなかなか人気が出ず、初期は典型的な「ビッグ・イン・ジャパン」状態であった。";
BOOST_CHECK_EQUAL((uint64_t) 4162027650ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 4162027650ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 4162027650ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
buffer = "코리아닷컴 메일알리미 서비스 중단안내 [안내] 개인정보취급방침 변경 안내 회사소개 | 광고안내 | 제휴안내 | 개인정보취급방침 | 청소년보호정책 | 스팸방지정책 | 사이버고객센터 | 약관안내 | 이메일 무단수집거부 | 서비스 전체보기";
BOOST_CHECK_EQUAL((uint64_t) 2360481044ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 2360481044ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 2360481044ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
buffer = "中华网以中国的市场为核心,致力为当地用户提供流动增值服务、网上娱乐及互联网服务。本公司亦推出网上游戏,及透过其门户网站提供包罗万有的网上产品及服务。";
BOOST_CHECK_EQUAL((uint64_t) 644060807ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 644060807ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 644060807ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
buffer = "כפי שסופיה קופולה היטיבה לבטא בסרטה אבודים בטוקיו, בתי מלון יוקרתיים בערים גדולות אמנם מציעים אינספור פינוקים, אבל הם גם עלולים לגרום לנו להרגיש בודדים ואומללים מאי פעם. לעומת זאת, B&B, בתים פרטיים שבהם אפשר לישון ולאכול ארוחת בוקר, הם דרך נהדרת להכיר עיר אירופאית כמו מקומיים ולפגוש אנשים מרתקים מרחבי העולם. לטובת מי שנוסע לממלכה בחודשים הקרובים, הגרדיאן הבריטי קיבץ את עשרת ה-B&B המומלצים ביותר בלונדון. כל שנותר הוא לבחור, ולהזמין מראש";
BOOST_CHECK_EQUAL((uint64_t) 1177579087ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 1177579087ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 1177579087ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
buffer = "بان يأسف لمقتل لاجئين سوريين بتركيا المرزوقي يندد بعنف الأمن التونسي تنديد بقتل الجيش السوري مصورا تلفزيونيا 14 قتيلا وعشرات الجرحى بانفجار بالصومال";
BOOST_CHECK_EQUAL((uint64_t) 1650013020ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 1650013020ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 1650013020ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
buffer = "Голкипер мадридского «Реала» Икер Касильяс призвал своих партнеров сосредоточить все мысли на предстоящем дерби с «Атлетико»";
BOOST_CHECK_EQUAL((uint64_t) 1084564896ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 1084564896ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 1084564896ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
buffer = "   ";
BOOST_CHECK_EQUAL((uint64_t) 2342474570ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 2342474570ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 2342474570ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
buffer = "अ आ इ ई उ ऊ ऋ ॠ ऌ ॡ ए ऐ ओ औ क ख ग घ ङ च छ ज झ ञ ट ठ ड ढ ण त थ द ध न प फ ब भ म य र ल व श ष स ह";
BOOST_CHECK_EQUAL((uint64_t) 2714476779ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 2714476779ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 2714476779ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
buffer = "tɜt kɐː mɔj ŋɨɜj siŋ za ɗew ɗɨɜk tɨɰ zɔ vɐː ɓiŋ ɗɐŋ vej ɲɜn fɜm vɐː kɨɜn. mɔj kɔn ŋɨɜj ɗeu ɗɨɜk tɐːw huɜ ɓɐːn cɔ li ci vɐː lɨɜŋ tɜm vɐː kɜn fɐːj ɗoj sɨ vɜj ɲɐw cɔŋ tiŋ ɓɐŋ hɨw.";
BOOST_CHECK_EQUAL((uint64_t) 3194095589ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 3194095589ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 3194095589ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
buffer = "äöüßÄÖÜ€µ";
BOOST_CHECK_EQUAL((uint64_t) 2590070434ULL, TRI_Crc32HashString(buffer.c_str()));
BOOST_CHECK_EQUAL((uint64_t) 2590070434ULL, TRI_Crc32HashPointer(buffer.c_str(), strlen(buffer.c_str())));
BOOST_CHECK_EQUAL((uint64_t) 2590070434ULL, TRI_FinalCrc32(TRI_BlockCrc32(TRI_InitialCrc32(), buffer.c_str(), strlen(buffer.c_str()))));
}
////////////////////////////////////////////////////////////////////////////////

View File

@ -491,6 +491,30 @@ BOOST_AUTO_TEST_CASE (tst_duplicate_keys) {
/// @brief test hashing
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_json_hash_utf8) {
TRI_json_t* json;
json = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "\"äöüßÄÖÜ€µ\"");
BOOST_CHECK_EQUAL(17926322495289827824ULL, TRI_HashJson(json));
FREE_JSON
json = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "\"코리아닷컴 메일알리미 서비스 중단안내 [안내] 개인정보취급방침 변경 안내 회사소개 | 광고안내 | 제휴안내 | 개인정보취급방침 | 청소년보호정책 | 스팸방지정책 | 사이버고객센터 | 약관안내 | 이메일 무단수집거부 | 서비스 전체보기\"");
BOOST_CHECK_EQUAL(11647939066062684691ULL, TRI_HashJson(json));
FREE_JSON
json = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "\"بان يأسف لمقتل لاجئين سوريين بتركيا المرزوقي يندد بعنف الأمن التونسي تنديد بقتل الجيش السوري مصورا تلفزيونيا 14 قتيلا وعشرات الجرحى بانفجار بالصومال\"");
BOOST_CHECK_EQUAL(9773937585298648628ULL, TRI_HashJson(json));
FREE_JSON
json = TRI_JsonString(TRI_UNKNOWN_MEM_ZONE, "\"中华网以中国的市场为核心,致力为当地用户提供流动增值服务、网上娱乐及互联网服务。本公司亦推出网上游戏,及透过其门户网站提供包罗万有的网上产品及服务。\"");
BOOST_CHECK_EQUAL(5348732066920102360ULL, TRI_HashJson(json));
FREE_JSON
}
////////////////////////////////////////////////////////////////////////////////
/// @brief test hashing
////////////////////////////////////////////////////////////////////////////////
BOOST_AUTO_TEST_CASE (tst_json_hash) {
TRI_json_t* json;

View File

@ -79,6 +79,25 @@ window.Users = Backbone.Model.extend({
error: function(data) {
}
});
},
setExtras: function(name, img) {
var self = this,
result = false;
$.ajax({
cache: false,
type: "PATCH",
async: false, // sequential calls!
url: "/_api/user/" + this.get("user"),
data: JSON.stringify({"extra": {"name":name, "img":img}}),
contentType: "application/json",
processData: false,
success: function(data) {
},
error: function(data) {
}
});
}
});

View File

@ -356,16 +356,16 @@
submitEditCurrentUserProfile: function() {
var self = this;
var name = $('#editCurrentName').val();
var img = $('#editCurrentUserProfileImg').val();
var name = $('#editCurrentName').val();
var img = $('#editCurrentUserProfileImg').val();
img = this.parseImgString(img);
/* if (!this.validateName(name)) {
$('#editName').closest("th").css("backgroundColor", "red");
return;
}*/
this.currentUser.save({"extra": {"name":name, "img":img}});
this.currentUser.setExtras(name, img);
$('#editCurrentUserProfileModal').modal('hide');
this.updateUserProfile();
},

View File

@ -506,7 +506,7 @@ static int ResizeMultiPointer (TRI_multi_pointer_t* array, size_t size) {
oldTable = array->_table;
oldAlloc = array->_nrAlloc;
array->_nrAlloc = TRI_NextPrime((uint64_t) size);
array->_nrAlloc = TRI_NearPrime((uint64_t) size);
array->_table_alloc = TRI_Allocate(array->_memoryZone,
array->_nrAlloc * sizeof(TRI_multi_pointer_entry_t) + 64,true);
array->_table = (TRI_multi_pointer_entry_t*)

View File

@ -31,6 +31,20 @@
// --SECTION-- FNV
// -----------------------------------------------------------------------------
// -----------------------------------------------------------------------------
// --SECTION-- private functions for FNV
// -----------------------------------------------------------------------------
////////////////////////////////////////////////////////////////////////////////
/// @brief the FNV hash work horse
////////////////////////////////////////////////////////////////////////////////
static inline uint64_t FnvWork (uint8_t value, uint64_t hash) {
static const uint64_t MagicPrime = 0x00000100000001b3ULL;
return (hash ^ value) * MagicPrime;
}
// -----------------------------------------------------------------------------
// --SECTION-- public functions for FNV
// -----------------------------------------------------------------------------
@ -41,11 +55,18 @@
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a FNV hash for blobs
/// @brief computes a FNV hash for strings with a length
////////////////////////////////////////////////////////////////////////////////
uint64_t TRI_FnvHashBlob (TRI_blob_t* blob) {
return TRI_FnvHashPointer(blob->data, blob->length);
uint64_t TRI_FnvHashBlock (uint64_t hash, void const* buffer, size_t length) {
uint8_t const* p = (uint8_t const*) buffer;
uint8_t const* end = p + length;
while (p < end) {
hash = FnvWork(*p++, hash);
}
return hash;
}
////////////////////////////////////////////////////////////////////////////////
@ -53,23 +74,15 @@ uint64_t TRI_FnvHashBlob (TRI_blob_t* blob) {
////////////////////////////////////////////////////////////////////////////////
uint64_t TRI_FnvHashPointer (void const* buffer, size_t length) {
uint64_t nMagicPrime;
uint64_t nHashVal;
uint8_t const* pFirst;
uint8_t const* pLast;
return TRI_FnvHashBlock(0xcbf29ce484222325ULL, buffer, length);
}
nMagicPrime = 0x00000100000001b3ULL;
nHashVal = 0xcbf29ce484222325ULL;
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a FNV hash for blobs
////////////////////////////////////////////////////////////////////////////////
pFirst = (uint8_t const*) buffer;
pLast = pFirst + length;
while (pFirst < pLast) {
nHashVal ^= *pFirst++;
nHashVal *= nMagicPrime;
}
return nHashVal;
uint64_t TRI_FnvHashBlob (TRI_blob_t* blob) {
return TRI_FnvHashPointer(blob->data, blob->length);
}
////////////////////////////////////////////////////////////////////////////////
@ -94,23 +107,6 @@ uint64_t TRI_FnvHashString (char const* buffer) {
return nHashVal;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a FNV hash for strings with a length
////////////////////////////////////////////////////////////////////////////////
uint64_t TRI_FnvHashBlock (uint64_t hash, char const* buffer, size_t length) {
uint64_t nMagicPrime;
size_t j;
nMagicPrime = 0x00000100000001b3ULL;
for (j = 0; j < length; ++j) {
hash ^= buffer[j];
hash *= nMagicPrime;
}
return hash;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a initial FNV for blocks
////////////////////////////////////////////////////////////////////////////////

View File

@ -48,10 +48,10 @@ extern "C" {
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a FNV hash for blobs
/// @brief computes a FNV hash for blocks
////////////////////////////////////////////////////////////////////////////////
uint64_t TRI_FnvHashBlob (TRI_blob_t*);
uint64_t TRI_FnvHashBlock (uint64_t, void const*, size_t);
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a FNV hash for memory blobs
@ -59,18 +59,18 @@ uint64_t TRI_FnvHashBlob (TRI_blob_t*);
uint64_t TRI_FnvHashPointer (void const*, size_t);
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a FNV hash for blobs
////////////////////////////////////////////////////////////////////////////////
uint64_t TRI_FnvHashBlob (TRI_blob_t*);
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a FNV hash for strings
////////////////////////////////////////////////////////////////////////////////
uint64_t TRI_FnvHashString (char const*);
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a FNV hash for blocks
////////////////////////////////////////////////////////////////////////////////
uint64_t TRI_FnvHashBlock (uint64_t, char const*, size_t);
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a initial FNV for blocks
////////////////////////////////////////////////////////////////////////////////

View File

@ -767,6 +767,25 @@ TRI_json_t* TRI_MergeJson (TRI_memory_zone_t* zone,
return result;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief computes a FNV hash for strings with a length
/// this function has an influence on how keys are distributed to shards
/// change with caution!
////////////////////////////////////////////////////////////////////////////////
static uint64_t HashBlock (uint64_t hash, char const* buffer, size_t length) {
uint64_t nMagicPrime;
size_t j;
nMagicPrime = 0x00000100000001b3ULL;
for (j = 0; j < length; ++j) {
hash ^= buffer[j];
hash *= nMagicPrime;
}
return hash;
}
////////////////////////////////////////////////////////////////////////////////
/// @brief compute a hash value for a JSON document, starting with a given
/// initial hash value. Note that a NULL pointer for json hashes to the
@ -780,7 +799,7 @@ static uint64_t HashJsonRecursive (uint64_t hash, TRI_json_t const* object) {
TRI_json_t const* subjson;
if (0 == object) {
return TRI_FnvHashBlock(hash, "null", 4); // strlen("null")
return HashBlock(hash, "null", 4); // strlen("null")
}
switch (object->_type) {
case TRI_JSON_UNUSED: {
@ -788,31 +807,31 @@ static uint64_t HashJsonRecursive (uint64_t hash, TRI_json_t const* object) {
}
case TRI_JSON_NULL: {
return TRI_FnvHashBlock(hash, "null", 4); // strlen("null")
return HashBlock(hash, "null", 4); // strlen("null")
}
case TRI_JSON_BOOLEAN: {
if (object->_value._boolean) {
return TRI_FnvHashBlock(hash, "true", 4); // strlen("true")
return HashBlock(hash, "true", 4); // strlen("true")
}
else {
return TRI_FnvHashBlock(hash, "false", 5); // strlen("true")
return HashBlock(hash, "false", 5); // strlen("true")
}
}
case TRI_JSON_NUMBER: {
return TRI_FnvHashBlock(hash, (char const*) &(object->_value._number),
sizeof(object->_value._number));
return HashBlock(hash, (char const*) &(object->_value._number), sizeof(object->_value._number));
}
case TRI_JSON_STRING:
case TRI_JSON_STRING_REFERENCE: {
return TRI_FnvHashBlock(hash, object->_value._string.data,
object->_value._string.length);
return HashBlock(hash,
object->_value._string.data,
object->_value._string.length);
}
case TRI_JSON_ARRAY: {
hash = TRI_FnvHashBlock(hash, "array", 5); // strlen("array")
hash = HashBlock(hash, "array", 5); // strlen("array")
n = object->_value._objects._length;
tmphash = hash;
for (i = 0; i < n; i += 2) {
@ -827,7 +846,7 @@ static uint64_t HashJsonRecursive (uint64_t hash, TRI_json_t const* object) {
}
case TRI_JSON_LIST: {
hash = TRI_FnvHashBlock(hash, "list", 4); // strlen("list")
hash = HashBlock(hash, "list", 4); // strlen("list")
n = object->_value._objects._length;
for (i = 0; i < n; ++i) {
subjson = (const TRI_json_t*) TRI_AtVector(&object->_value._objects, i);

View File

@ -78,7 +78,7 @@ static const uint64_t Primes[251] = {
/// @brief return a prime number not lower than value
////////////////////////////////////////////////////////////////////////////////
uint64_t TRI_NextPrime (uint64_t value) {
uint64_t TRI_NearPrime (uint64_t value) {
unsigned int i;
for (i = 0; i < sizeof(Primes); ++i) {

View File

@ -42,7 +42,7 @@ extern "C" {
/// @brief return a prime number not lower than value
////////////////////////////////////////////////////////////////////////////////
uint64_t TRI_NextPrime (uint64_t);
uint64_t TRI_NearPrime (uint64_t);
#ifdef __cplusplus
}

View File

@ -75,6 +75,7 @@ add_library(
BasicsC/csv.c
BasicsC/debugging.c
BasicsC/error.c
BasicsC/fasthash.c
BasicsC/files.c
BasicsC/hashes.c
BasicsC/init.c
@ -85,6 +86,7 @@ add_library(
BasicsC/memory.c
BasicsC/mersenne.c
BasicsC/mimetypes.c
BasicsC/prime-numbers.c
BasicsC/process-utils.c
BasicsC/random.c
BasicsC/skip-list.c
@ -99,6 +101,7 @@ add_library(
BasicsC/voc-errors.c
BasicsC/voc-mimetypes.c
BasicsC/tri-zip.c
BasicsC/xxhash.c
JsonParser/json-parser.c
ProgramOptions/program-options.c
Rest/AnyServer.cpp