@@ -158,7 +158,11 @@ using namespace iresearch;
158
158
class features {
159
159
public:
160
160
enum Mask : uint32_t {
161
- POS = 3 , POS_OFFS = 7 , POS_PAY = 11 , POS_OFFS_PAY = 15
161
+ DOCS = 0 ,
162
+ FREQ = 1 ,
163
+ POS = 2 ,
164
+ OFFS = 4 ,
165
+ PAY = 8
162
166
};
163
167
164
168
features () = default ;
@@ -188,10 +192,20 @@ class features {
188
192
bool payload () const NOEXCEPT { return irs::check_bit<3 >(mask_); }
189
193
operator Mask () const NOEXCEPT { return static_cast <Mask>(mask_); }
190
194
195
+ bool any (Mask mask) const NOEXCEPT {
196
+ return Mask (0 ) != (mask_ & mask);
197
+ }
198
+
199
+ bool all (Mask mask) const NOEXCEPT {
200
+ return mask != (mask_ & mask);
201
+ }
202
+
191
203
private:
192
204
irs::byte_type mask_{};
193
205
}; // features
194
206
207
+ ENABLE_BITMASK_ENUM (features::Mask);
208
+
195
209
// ----------------------------------------------------------------------------
196
210
// --SECTION-- forward declarations
197
211
// ----------------------------------------------------------------------------
@@ -492,7 +506,7 @@ void postings_writer::prepare(index_output& out, const iresearch::flush_state& s
492
506
std::memset (doc.freqs .get (), 0 , sizeof (uint32_t ) * BLOCK_SIZE);
493
507
}
494
508
495
- if (features.check < position >()) {
509
+ if (features.check <position>()) {
496
510
// prepare proximity stream
497
511
if (!pos_) {
498
512
pos_ = memory::make_unique< pos_stream >();
@@ -501,7 +515,7 @@ void postings_writer::prepare(index_output& out, const iresearch::flush_state& s
501
515
pos_->reset ();
502
516
prepare_output (name, pos_->out , state, POS_EXT, POS_FORMAT_NAME, FORMAT_MAX);
503
517
504
- if (features.check < payload >() || features.check < offset >()) {
518
+ if (features.check <payload>() || features.check <offset>()) {
505
519
// prepare payload stream
506
520
if (!pay_) {
507
521
pay_ = memory::make_unique<pay_stream>();
@@ -629,11 +643,11 @@ void postings_writer::begin_term() {
629
643
doc.start = doc.out ->file_pointer ();
630
644
std::fill_n (doc.skip_ptr , MAX_SKIP_LEVELS, doc.start );
631
645
if (features_.position ()) {
632
- assert (pos_);
646
+ assert (pos_ && pos_-> out );
633
647
pos_->start = pos_->out ->file_pointer ();
634
648
std::fill_n (pos_->skip_ptr , MAX_SKIP_LEVELS, pos_->start );
635
- if (features_.payload () || features_. offset ( )) {
636
- assert (pay_);
649
+ if (features_.any (features::OFFS | features::PAY )) {
650
+ assert (pay_ && pay_-> out );
637
651
pay_->start = pay_->out ->file_pointer ();
638
652
std::fill_n (pay_->skip_ptr , MAX_SKIP_LEVELS, pay_->start );
639
653
}
@@ -674,7 +688,7 @@ void postings_writer::begin_doc(doc_id_t id, const frequency* freq) {
674
688
675
689
void postings_writer::add_position (uint32_t pos, const offset* offs, const payload* pay) {
676
690
assert (!offs || offs->start <= offs->end );
677
- assert (pos_); /* at least positions stream should be created */
691
+ assert (features_. position () && pos_ && pos_-> out ); /* at least positions stream should be created */
678
692
679
693
pos_->pos (pos - pos_->last );
680
694
if (pay) pay_->payload (pos_->size , pay->value );
@@ -686,26 +700,29 @@ void postings_writer::add_position(uint32_t pos, const offset* offs, const paylo
686
700
pos_->flush (buf);
687
701
688
702
if (pay) {
703
+ assert (features_.payload () && pay_ && pay_->out );
689
704
pay_->flush_payload (buf);
690
705
}
691
706
692
707
if (offs) {
708
+ assert (features_.payload () && pay_ && pay_->out );
693
709
pay_->flush_offsets (buf);
694
710
}
695
711
}
696
712
}
697
713
698
714
void postings_writer::end_doc () {
699
- if ( doc.full () ) {
715
+ if (doc.full ()) {
700
716
doc.block_last = doc.last ;
701
717
doc.end = doc.out ->file_pointer ();
702
- if ( pos_ ) {
703
- assert ( pos_ );
718
+ if (features_. position () ) {
719
+ assert (pos_ && pos_-> out );
704
720
pos_->end = pos_->out ->file_pointer ();
705
721
// documents stream is full, but positions stream is not
706
722
// save number of positions to skip before the next block
707
723
pos_->block_last = pos_->size ;
708
- if ( pay_ ) {
724
+ if (features_.any (features::OFFS | features::PAY)) {
725
+ assert (pay_ && pay_->out );
709
726
pay_->end = pay_->out ->file_pointer ();
710
727
pay_->block_last = pay_->pay_buf_ .size ();
711
728
}
@@ -751,6 +768,8 @@ void postings_writer::end_term(version10::term_meta& meta, const uint32_t* tfreq
751
768
/* write remaining position using
752
769
* variable length encoding */
753
770
if (features_.position ()) {
771
+ assert (pos_ && pos_->out );
772
+
754
773
if (meta.freq > BLOCK_SIZE) {
755
774
meta.pos_end = pos_->out ->file_pointer () - pos_->start ;
756
775
}
@@ -763,6 +782,8 @@ void postings_writer::end_term(version10::term_meta& meta, const uint32_t* tfreq
763
782
for (uint32_t i = 0 ; i < pos_->size ; ++i) {
764
783
const uint32_t pos_delta = pos_->buf [i];
765
784
if (features_.payload ()) {
785
+ assert (pay_ && pay_->out );
786
+
766
787
const uint32_t size = pay_->pay_sizes [i];
767
788
if (last_pay_size != size) {
768
789
last_pay_size = size;
@@ -781,6 +802,8 @@ void postings_writer::end_term(version10::term_meta& meta, const uint32_t* tfreq
781
802
}
782
803
783
804
if (features_.offset ()) {
805
+ assert (pay_ && pay_->out );
806
+
784
807
const uint32_t pay_offs_delta = pay_->offs_start_buf [i];
785
808
const uint32_t len = pay_->offs_len_buf [i];
786
809
if (len == last_offs_len) {
@@ -794,6 +817,7 @@ void postings_writer::end_term(version10::term_meta& meta, const uint32_t* tfreq
794
817
}
795
818
796
819
if (features_.payload ()) {
820
+ assert (pay_ && pay_->out );
797
821
pay_->pay_buf_ .clear ();
798
822
}
799
823
}
@@ -850,8 +874,8 @@ void postings_writer::write_skip(size_t level, index_output& out) {
850
874
851
875
pos_->skip_ptr [level] = pos_ptr;
852
876
853
- if (features_.payload () || features_. offset ( )) {
854
- assert (pay_);
877
+ if (features_.any (features::OFFS | features::PAY )) {
878
+ assert (pay_ && pay_-> out );
855
879
856
880
if (features_.payload ()) {
857
881
out.write_vint (static_cast <uint32_t >(pay_->block_last ));
@@ -886,7 +910,7 @@ void postings_writer::encode(
886
910
if (type_limits<type_t ::address_t >::valid (meta.pos_end )) {
887
911
out.write_vlong (meta.pos_end );
888
912
}
889
- if (features_.payload () || features_. offset ( )) {
913
+ if (features_.any (features::OFFS | features::PAY )) {
890
914
out.write_vlong (meta.pay_start - last_state.pay_start );
891
915
}
892
916
}
@@ -5053,6 +5077,12 @@ void postings_reader::decode(
5053
5077
}
5054
5078
}
5055
5079
5080
+ #if defined(_MSC_VER)
5081
+ #elif defined (__GNUC__)
5082
+ #pragma GCC diagnostic push
5083
+ #pragma GCC diagnostic ignored "-Wswitch"
5084
+ #endif
5085
+
5056
5086
irs::doc_iterator::ptr postings_reader::iterator (
5057
5087
const flags& field,
5058
5088
const attribute_view& attrs,
@@ -5064,17 +5094,24 @@ irs::doc_iterator::ptr postings_reader::iterator(
5064
5094
const auto enabled = features & req;
5065
5095
doc_iterator::ptr it;
5066
5096
5067
- switch (enabled) {
5068
- case features::POS_OFFS_PAY:
5097
+ // MSVC 2013 doesn't support constexpr, can't use
5098
+ // 'operator|' in the following switch statement
5099
+ CONSTEXPR const auto FREQ_POS_OFFS_PAY = features::FREQ | features::POS | features::OFFS | features::PAY;
5100
+ CONSTEXPR const auto FREQ_POS_OFFS = features::FREQ | features::POS | features::OFFS;
5101
+ CONSTEXPR const auto FREQ_POS_PAY = features::FREQ | features::POS | features::PAY;
5102
+ CONSTEXPR const auto FREQ_POS = features::FREQ | features::POS;
5103
+
5104
+ switch (enabled) {
5105
+ case FREQ_POS_OFFS_PAY:
5069
5106
it = doc_iterator::make<pos_doc_iterator<offs_pay_iterator>>();
5070
5107
break ;
5071
- case features::POS_OFFS :
5108
+ case FREQ_POS_OFFS :
5072
5109
it = doc_iterator::make<pos_doc_iterator<offs_iterator>>();
5073
5110
break ;
5074
- case features::POS_PAY :
5111
+ case FREQ_POS_PAY :
5075
5112
it = doc_iterator::make<pos_doc_iterator<pay_iterator>>();
5076
5113
break ;
5077
- case features::POS :
5114
+ case FREQ_POS :
5078
5115
it = doc_iterator::make<pos_doc_iterator<pos_iterator>>();
5079
5116
break ;
5080
5117
default :
@@ -5089,6 +5126,11 @@ irs::doc_iterator::ptr postings_reader::iterator(
5089
5126
return IMPLICIT_MOVE_WORKAROUND (it);
5090
5127
}
5091
5128
5129
+ #if defined(_MSC_VER)
5130
+ #elif defined (__GNUC__)
5131
+ #pragma GCC diagnostic pop
5132
+ #endif
5133
+
5092
5134
// actual implementation
5093
5135
class format : public irs ::version10::format {
5094
5136
public:
@@ -5231,4 +5273,4 @@ NS_END // root
5231
5273
5232
5274
// -----------------------------------------------------------------------------
5233
5275
// --SECTION-- END-OF-FILE
5234
- // -----------------------------------------------------------------------------
5276
+ // -----------------------------------------------------------------------------
0 commit comments