diff --git a/src/include/engine.h b/src/include/engine.h index d61778f..4d12fa4 100644 --- a/src/include/engine.h +++ b/src/include/engine.h @@ -18,7 +18,7 @@ class TicketSystemEngine { #endif bool its_time_to_exit = false; std::string data_directory; - std::map online_users; + sjtu::map online_users; /** * @brief user data system diff --git a/src/include/stop_register.hpp b/src/include/stop_register.hpp index fad407c..c61b82e 100644 --- a/src/include/stop_register.hpp +++ b/src/include/stop_register.hpp @@ -100,7 +100,7 @@ class StopRegister : public DataDriverBase { *reinterpret_cast(&record_leave)); } inline void QueryDirectTrains(uint32_t date, hash_t from_station_ID, hash_t to_station_ID, - std::vector &res) { + sjtu::vector &res) { const static int June_1st_2024 = 152; auto it_from = bpt_indexer->lower_bound_const({from_station_ID, 0}); auto it_to = bpt_indexer->lower_bound_const({to_station_ID, 0}); @@ -202,7 +202,7 @@ class StopRegister : public DataDriverBase { entry.to_stop_id = key_to.stop_id; success = true; } - inline void FetchTrainLeavingFrom(uint32_t date, hash_t from_station_ID, std::vector &res) { + inline void FetchTrainLeavingFrom(uint32_t date, hash_t from_station_ID, sjtu::vector &res) { const static int June_1st_2024 = 152; res.clear(); auto it_from = bpt_indexer->lower_bound_const({from_station_ID, 0}); @@ -232,7 +232,7 @@ class StopRegister : public DataDriverBase { ++it_from; } } - inline void FetchTrainArriavingAt(uint32_t date, hash_t to_station_ID, std::vector &res) { + inline void FetchTrainArriavingAt(uint32_t date, hash_t to_station_ID, sjtu::vector &res) { res.clear(); auto it_to = bpt_indexer->lower_bound_const({to_station_ID, 0}); while (it_to != bpt_indexer->end_const()) { diff --git a/src/include/transaction_mainenance.hpp b/src/include/transaction_mainenance.hpp index fe6df48..a9ab626 100644 --- a/src/include/transaction_mainenance.hpp +++ b/src/include/transaction_mainenance.hpp @@ -203,7 +203,7 @@ class TransactionManager : public DataDriverBase { order_history_indexer->Put(order_history_index, data_id); } inline void FetchQueue(hash_t train_ID_hash, uint8_t running_date_offset, - std::vector> &res) { + sjtu::vector> &res) { // warning: the validity of train_ID_hash is not checked queue_index_t queue_index_for_query; queue_index_for_query.train_ID_hash = train_ID_hash; @@ -228,7 +228,7 @@ class TransactionManager : public DataDriverBase { queue_index_for_query.id = id; queue_indexer->Remove(queue_index_for_query); } - inline void FetchFullUserOrderHistory(hash_t user_ID_hash, std::vector &res) { + inline void FetchFullUserOrderHistory(hash_t user_ID_hash, sjtu::vector &res) { // warning: the validity of user_ID_hash is not checked order_history_index_t order_history_index_for_query; order_history_index_for_query.user_ID_hash = user_ID_hash; diff --git a/src/transaction_system.cpp b/src/transaction_system.cpp index bde49a3..587fa46 100644 --- a/src/transaction_system.cpp +++ b/src/transaction_system.cpp @@ -50,10 +50,10 @@ std::string TicketSystemEngine::QueryTicket(const std::string &command) { LOG->debug("date {}={}-{}, from {}, to {}, order by {}", date, RetrieveReadableDate(date).first, RetrieveReadableDate(date).second, from, to, order_by); hash_t from_hash = SplitMix64Hash(from), to_hash = SplitMix64Hash(to); - std::vector valid_trains; + sjtu::vector valid_trains; stop_register.QueryDirectTrains(date, from_hash, to_hash, valid_trains); size_t len = valid_trains.size(); - std::vector> valid_trains_full(len); + sjtu::vector> valid_trains_full(len); LOG->debug("retrieving full data"); for (size_t i = 0; i < len; i++) { valid_trains_full[i].first = valid_trains[i]; @@ -78,7 +78,7 @@ std::string TicketSystemEngine::QueryTicket(const std::string &command) { valid_trains_full[i].second.seats = seats; } LOG->debug("successfully retrieved full data"); - std::vector valid_trains_full_index(len); + sjtu::vector valid_trains_full_index(len); for (size_t i = 0; i < len; i++) { valid_trains_full_index[i] = i; } @@ -163,8 +163,8 @@ std::string TicketSystemEngine::QueryTransfer(const std::string &command) { LOG->debug("date {}={}-{}, from {}, to {}, order by {}", date, RetrieveReadableDate(date).first, RetrieveReadableDate(date).second, from, to, order_by); bool has_solution = false; - std::vector trains_leaving_from_from; - std::vector trains_arriving_at_dest; + sjtu::vector trains_leaving_from_from; + sjtu::vector trains_arriving_at_dest; hash_t from_station_hash = SplitMix64Hash(from), to_station_hash = SplitMix64Hash(to); stop_register.FetchTrainLeavingFrom(date, from_station_hash, trains_leaving_from_from); stop_register.FetchTrainArriavingAt(date, to_station_hash, trains_arriving_at_dest); @@ -212,7 +212,7 @@ void TicketSystemEngine::CheckTransfer(hash_t train1_ID_hash, hash_t train2_ID_h int &res_train2_seat, std::string &res_transfer_station_name, bool sort_by_time) { if (train1_ID_hash == train2_ID_hash) return; - std::map transfer_mp; + sjtu::map transfer_mp; hash_t from_station_hash = SplitMix64Hash(from_station), to_station_hash = SplitMix64Hash(to_station); CoreTrainData train1_core_data, train2_core_data; core_train_data_storage.Get(train1_ID_hash, train1_core_data); @@ -513,7 +513,7 @@ std::string TicketSystemEngine::QueryOrder(const std::string &command) { response_stream << "[" << command_id << "] -1"; return response_stream.str(); } - std::vector his_idxs; + sjtu::vector his_idxs; transaction_manager.FetchFullUserOrderHistory(user_ID_hash, his_idxs); size_t len = his_idxs.size(); TransactionData txn_data; @@ -602,7 +602,7 @@ std::string TicketSystemEngine::RefundTicket(const std::string &command) { seats_data.seat[i] += txn_data.num; } seats_data_storage.Put({train_ID_hash, txn_data.running_date_offset}, seats_data); - std::vector> queue_idxs; + sjtu::vector> queue_idxs; transaction_manager.FetchQueue(train_ID_hash, txn_data.running_date_offset, queue_idxs); size_t len = queue_idxs.size(); for (size_t i = 0; i < len; i++) { diff --git a/stlite/vector.hpp b/stlite/vector.hpp index cfe2b52..7052389 100644 --- a/stlite/vector.hpp +++ b/stlite/vector.hpp @@ -126,6 +126,7 @@ class vector { */ bool operator!=(const iterator &rhs) const { return raw_pointer != rhs.raw_pointer; } bool operator!=(const const_iterator &rhs) const { return raw_pointer != rhs.raw_pointer; } + bool operator<(const iterator &rhs) const { return raw_pointer < rhs.raw_pointer; } }; /** * TODO @@ -231,6 +232,15 @@ class vector { allocated_length = 1; current_length = 0; } + vector(size_t len) { + raw_beg = alloc.allocate(len * 2); + raw_end = raw_beg + len; + allocated_length = len * 2; + current_length = len; + for (size_t i = 0; i < len; ++i) { + std::allocator_traits::construct(alloc, raw_beg + i); + } + } vector(const vector &other) { raw_beg = alloc.allocate(other.allocated_length); raw_end = raw_beg + other.current_length; @@ -536,6 +546,34 @@ class vector { } T *data() { return raw_beg; } + + void resize(size_t len) { + if (len < current_length) { + for (size_t i = len; i < current_length; ++i) { + std::allocator_traits::destroy(alloc, raw_beg + i); + } + raw_end = raw_beg + len; + current_length = len; + } else if (len > current_length) { + if (len > allocated_length) { + size_t new_allocated_length = len * 2; + T *new_raw_beg = alloc.allocate(new_allocated_length); + for (size_t i = 0; i < current_length; ++i) { + std::allocator_traits::construct(alloc, new_raw_beg + i, std::move(raw_beg[i])); + std::allocator_traits::destroy(alloc, raw_beg + i); + } + alloc.deallocate(raw_beg, allocated_length); + raw_beg = new_raw_beg; + raw_end = raw_beg + current_length; + allocated_length = new_allocated_length; + } + for (size_t i = current_length; i < len; ++i) { + std::allocator_traits::construct(alloc, raw_beg + i); + } + raw_end = raw_beg + len; + current_length = len; + } + } }; template std::allocator vector::alloc;