File: BondTypeHistory.cpp

package info (click to toggle)
pymol 2.5.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 42,288 kB
  • sloc: cpp: 476,472; python: 76,538; ansic: 29,510; javascript: 6,792; sh: 47; makefile: 24
file content (111 lines) | stat: -rw-r--r-- 3,231 bytes parent folder | download | duplicates (2)
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

/*
 * (c) Schrodinger, Inc.
 */

#include"BondTypeHistory.h"
#include"MemoryDebug.h"

#define COPY_ATTR(attr_name) dest->attr_name = src->attr_name
#define COPY_ATTR_ARR_2(attr_name) dest->attr_name[0] = src->attr_name[0]; dest->attr_name[1] = src->attr_name[1]
#define COPY_ATTR_N(attr_name, N) memcpy( dest->attr_name, src->attr_name, N)

/**
 * Use the legacy `stereo` attribute to distinguish between PyMOL 1.8.1 and
 * PyMOL 2.5 PSE binary dump formats. This allows us to introduce the `symop_2`
 * attribute without a backwards incompatible format change.
 */
namespace symop_stereo_magic_helper
{
constexpr signed char magic = 1 << 6;

static void set(void*) {}
template <typename toVersion, typename = decltype(&toVersion::stereo)>
static void set(toVersion* dest)
{
  dest->stereo = magic;
}

static bool get(const void*)
{
  return true;
}
template <typename fromVersion, typename = decltype(&fromVersion::stereo)>
static bool get(const fromVersion* src)
{
  return src->stereo == magic;
}
} // namespace symop_stereo_magic_helper

static void Copy_Attr_SymOp2(const void*, void*) {}
template <typename fromVersion, typename toVersion,
    typename = decltype(&fromVersion::symop_2),
    typename = decltype(&toVersion::symop_2)>
static void Copy_Attr_SymOp2(const fromVersion* src, toVersion* dest)
{
  if (src->symop_2 && symop_stereo_magic_helper::get(src)) {
    COPY_ATTR(symop_2);
    symop_stereo_magic_helper::set(dest);
  }
}

template <typename fromVersion, typename toVersion>
void Copy_BondType(const fromVersion *src,  toVersion *dest){
  COPY_ATTR(index[0]);
  COPY_ATTR(index[1]);
  COPY_ATTR(order);
  COPY_ATTR(unique_id);
  COPY_ATTR(has_setting);
  Copy_Attr_SymOp2(src, dest);
}

template <typename fromVersion, typename toVersion>
void CopyN_BondType(const fromVersion *src,  toVersion *dest, int NBond){
  for (int a = 0; a < NBond; ++a){
    Copy_BondType(src++, dest++);
  }
}

template <typename toVersion>
toVersion *CreateAndCopyN_BondType(const BondType *src, int NBond){
  toVersion *dest = VLACalloc(toVersion, NBond);
  toVersion *origdest = dest;
  for (int a = 0; a < NBond; ++a){
    Copy_BondType(src++, dest++);
  }
  return origdest;
}

void Copy_Into_BondType_From_Version(const void *src, int bondInfo_version, BondType *Bond, int NBond){
  switch(bondInfo_version){
  case 176:
    CopyN_BondType((BondType_1_7_6*)src, Bond, NBond);
    break;
  case 177:
    CopyN_BondType((BondType_1_7_7*)src, Bond, NBond);
    break;
  case 181:
    CopyN_BondType((BondType_1_8_1*)src, Bond, NBond);
    break;
  default:
      printf("ERROR: unknown bondInfo_version=%d from BondInfoVERSION=%d\n", bondInfo_version, BondInfoVERSION);
  }
}

void *Copy_To_BondType_Version(int bondInfo_version, BondType *Bond, int NBond){
  switch (bondInfo_version){
  case 176:
    return CreateAndCopyN_BondType<BondType_1_7_6>(Bond, NBond);
    break;
  case 177:
    return CreateAndCopyN_BondType<BondType_1_7_7>(Bond, NBond);
    break;
  case 181:
    return CreateAndCopyN_BondType<BondType_1_8_1>(Bond, NBond);
    break;
  default:
      printf("ERROR: Copy_To_BondType_Version: unknown bondInfo_version=%d from BondInfoVERSION=%d\n", bondInfo_version, BondInfoVERSION);
  }
  return nullptr;

}