91 {
92 int set_size = src_sets->size();
93
94
95 for (int i = 0; i < set_size; ++i) {
97 if (column_set == nullptr)
98 continue;
99
100
101 ColPartition_IT part_it(&parts_);
103 int prev_right = INT32_MIN;
104 part_it.mark_cycle_pt();
105 ColPartition_IT col_it(&column_set->parts_);
106 for (col_it.mark_cycle_pt(); !col_it.cycled_list(); col_it.forward()) {
107 ColPartition* col_part = col_it.data();
109 continue;
110 int col_left = col_part->left_key();
111 int col_right = col_part->right_key();
112
113 ColPartition* part = part_it.data();
114 while (!part_it.at_last() && part->right_key() < col_left) {
115 prev_right = part->right_key();
116 part_it.forward();
117 part = part_it.data();
118 }
119 int part_left = part->left_key();
120 int part_right = part->right_key();
121 if (part_right < col_left || col_right < part_left) {
122
123 AddPartition(col_part->ShallowCopy(), &part_it);
124 continue;
125 }
126
127 bool part_width_ok = cb->Run(part->KeyWidth(part_left, part_right));
128 if (col_left < part_left && col_left > prev_right) {
129
130
131 int col_box_left = col_part->BoxLeftKey();
132 bool tab_width_ok = cb->Run(part->KeyWidth(col_left, part_right));
133 bool box_width_ok = cb->Run(part->KeyWidth(col_box_left, part_right));
134 if (tab_width_ok || (!part_width_ok)) {
135
136
137 part->CopyLeftTab(*col_part, false);
138 part->SetColumnGoodness(cb);
139 } else if (col_box_left < part_left &&
140 (box_width_ok || !part_width_ok)) {
141
142
143 part->CopyLeftTab(*col_part, true);
144 part->SetColumnGoodness(cb);
145 }
146 part_left = part->left_key();
147 }
148 if (col_right > part_right &&
149 (part_it.at_last() ||
150 part_it.data_relative(1)->left_key() > col_right)) {
151
152 int col_box_right = col_part->BoxRightKey();
153 bool tab_width_ok = cb->Run(part->KeyWidth(part_left, col_right));
154 bool box_width_ok = cb->Run(part->KeyWidth(part_left, col_box_right));
155 if (tab_width_ok || (!part_width_ok)) {
156
157
158 part->CopyRightTab(*col_part, false);
159 part->SetColumnGoodness(cb);
160 } else if (col_box_right > part_right &&
161 (box_width_ok || !part_width_ok)) {
162
163
164 part->CopyRightTab(*col_part, true);
165 part->SetColumnGoodness(cb);
166 }
167 }
168 }
169 }
170 ComputeCoverage();
171}