Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

GAP 4.8.9 installation with standard packages -- copy to your CoCalc project to get it

1035287 views
1
//
2
// util.cpp
3
// Bistellar
4
//
5
// Created by Alexander Thumm on 07.10.11.
6
// Copyright 2011 -. All rights reserved.
7
//
8
9
#include "util.h"
10
#include <stdlib.h>
11
#include <string.h>
12
13
size_t remove_duplicates(void * base, size_t num, size_t size, int (* comparison)(const void *, const void *))
14
{
15
if (num == 0)
16
return 0;
17
18
size_t new_num = 1;
19
20
const unsigned char * read = static_cast< const unsigned char * >(base);
21
unsigned char * write = static_cast< unsigned char * >(base);
22
23
for (size_t i = 1; i < num; i++)
24
{
25
read += size;
26
if ((*comparison)(read, write) != 0)
27
{
28
write += size;
29
if (write != read)
30
memcpy(write, read, size);
31
32
new_num++;
33
}
34
}
35
36
return new_num;
37
}
38
39
size_t remove_from_set(void * base, size_t num, const void * base2, size_t num2, size_t size, int (* comparison)(const void *, const void *))
40
{
41
if (num == 0 || num2 == 0)
42
return 0;
43
44
size_t new_num = 0;
45
46
const unsigned char * read = static_cast< const unsigned char * >(base);
47
const unsigned char * read2 = static_cast< const unsigned char *>(base2);
48
unsigned char * write = static_cast< unsigned char * >(base);
49
50
size_t i = 0;
51
size_t j = 0;
52
53
while (i < num)
54
{
55
int difference = (j < num2) ? (*comparison)(read, read2) : -1;
56
57
if (difference < 0)
58
{
59
if (write != read)
60
memcpy(write, read, size);
61
read += size;
62
write += size;
63
new_num++;
64
i++;
65
}
66
else if (difference == 0)
67
{
68
read += size;
69
i++;
70
}
71
else
72
{
73
read2 += size;
74
j++;
75
}
76
}
77
78
return new_num;
79
}
80
81