File: Hash.hh

package info (click to toggle)
cadabra2 2.4.3.2-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 78,732 kB
  • sloc: ansic: 133,450; cpp: 92,064; python: 1,530; javascript: 203; sh: 184; xml: 182; objc: 53; makefile: 51
file content (53 lines) | stat: -rw-r--r-- 1,377 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#pragma once

#include "Storage.hh"

namespace cadabra
{
	enum HashFlags : unsigned int
	{
		HASH_DEFAULT = 0x0,
		HASH_IGNORE_TOP_MULTIPLIER = 0x1,
		HASH_IGNORE_MULTIPLIER = 0x2,
		HASH_IGNORE_PRODUCT_ORDER = 0x4,
		HASH_IGNORE_SUM_ORDER = 0x8,
		HASH_IGNORE_INDEX_ORDER = 0x10,
		HASH_IGNORE_PARENT_REL = 0x20,
		HASH_IGNORE_BRACKET_TYPE = 0x40,
		HASH_IGNORE_CHILDREN = 0x80,
		HASH_IGNORE_NAMES = 0x100,
		HASH_IGNORE_INDICES = 0x200,
		HASH_IGNORE_CHILD_ORDER = 0x400
	};

	class Ex_hasher
	{
	public:
		using result_t = size_t;
		Ex_hasher();
		Ex_hasher(HashFlags flags);

		result_t operator () (const Ex& ex) const;
		result_t operator () (Ex::iterator it) const;

		void set_flags(HashFlags flags);
		HashFlags get_flags() const;
		void add_flags(HashFlags flags);
		void remove_flags(HashFlags flags);

	private:
		result_t hash(Ex::iterator it, bool toplevel) const;
		bool flag_set(HashFlags flag) const;

		HashFlags flags;
	};

	HashFlags operator ~ (HashFlags flags);
	HashFlags operator | (HashFlags lhs, HashFlags rhs);
	HashFlags operator & (HashFlags lhs, HashFlags rhs);
	HashFlags& operator |= (HashFlags& lhs, HashFlags rhs);
	HashFlags& operator &= (HashFlags& lhs, HashFlags rhs);

	Ex_hasher::result_t hash_ex(Ex::iterator it, HashFlags flags = HASH_DEFAULT);
	bool hash_compare(Ex::iterator lhs, Ex::iterator rhs, HashFlags flags = HASH_DEFAULT);
}