From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail1-relais-roc.national.inria.fr (mail1-relais-roc.national.inria.fr [192.134.164.82]) by yquem.inria.fr (Postfix) with ESMTP id 731DDBC57 for ; Mon, 7 Jun 2010 20:51:01 +0200 (CEST) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AkICAMnbDExKfVI0mGdsb2JhbACDHZp7CBUBAQEBAQgJDAcRIq9LgjoBBY5FAQSBJoMDbg X-IronPort-AV: E=Sophos;i="4.53,379,1272837600"; d="scan'208";a="60819925" Received: from mail-ww0-f52.google.com ([74.125.82.52]) by mail1-smtp-roc.national.inria.fr with ESMTP; 07 Jun 2010 20:51:01 +0200 Received: by wwb31 with SMTP id 31so3061200wwb.39 for ; Mon, 07 Jun 2010 11:51:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:references :date:in-reply-to:message-id:user-agent:mime-version:content-type :content-transfer-encoding; bh=IpwO6qWwy7JPhTHlOwBYlzi1EqQI3pivWCL80zN9s6I=; b=A8licOv9UXJEM0Xf9I5E2/80qHH3DCcqjXJUGYd0a+zY+wcNh4R1H6ioA7qVPP4p1T NiNY1xhOPpbVCwltEciNZbzMhKJtdLGvqSCEZuile7VTlTAqwgqwH1fFy9ucNxUiM7yX BIdP4xsThnq3gTPetk0A82AZGnyxnhWUOtINo= DomainKey-Signature: a=rsa-sha1; c=nofws; d=googlemail.com; s=gamma; h=from:to:cc:subject:references:date:in-reply-to:message-id :user-agent:mime-version:content-type:content-transfer-encoding; b=AHASh6iSanHndmkGu6CXhyi0TO2XV0xhFhrLlaV+19wT4Bs/1hLvF/sqanA5e/1A5z 5gf2ayl5Hcp77J2VbnOXe8NhR2IbQ/VUn9U7wEyNt5430ugZ24WlYwvnHxlNNMo58tFG iA7HHYjKOv03cFEJ1FWZdhJBwbS+ggYHG8A/w= Received: by 10.216.166.68 with SMTP id f46mr2714264wel.6.1275936658299; Mon, 07 Jun 2010 11:50:58 -0700 (PDT) Received: from spec-desktop.specuu.com ([86.141.180.78]) by mx.google.com with ESMTPS id d75sm1812515wek.8.2010.06.07.11.50.57 (version=TLSv1/SSLv3 cipher=RC4-MD5); Mon, 07 Jun 2010 11:50:57 -0700 (PDT) From: W Dan Meyer To: =?utf-8?B?VMO2csO2aw==?= Edwin Cc: Wojciech Meyer , caml-list@yquem.inria.fr Subject: Re: [Caml-list] Converting variants with only constant constructors to integers References: <4C0D3557.1020200@gmail.com> <87sk4y7lc7.fsf@gmail.com> <4C0D3B0F.4060502@gmail.com> <4C0D3B3E.5050408@gmail.com> Date: Mon, 07 Jun 2010 19:50:33 +0100 In-Reply-To: <4C0D3B3E.5050408@gmail.com> (=?utf-8?B?IlTDtnLDtms=?= Edwin"'s message of "Mon, 07 Jun 2010 21:32:30 +0300") Message-ID: <87bpbm7k3q.fsf@gmail.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.0.50 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam: no; 0.00; variants:01 constructors:01 integers:01 flags:01 lablgl:01 camlprim:01 val:01 accum:01 buffer:01 accum:01 buffer:01 val:01 struct:01 struct:01 -rwxr-xr-x:01 T=C3=B6r=C3=B6k Edwin writes: > > Yes, I probably should have started with that. > I have some flags like: > type myflags =3D Property1 | Property2 | Property3;; Hmm, you can take a look at lablgl sources, they use a lot this kind of constructs. Here is the answer: CAMLprim value ml_glPushAttrib (value list) { GLbitfield mask =3D 0; while (list !=3D Val_int(0)) { switch (Field(list,0)) { case MLTAG_accum_buffer:mask |=3D GL_ACCUM_BUFFER_BIT; break; case MLTAG_color_buffer:mask |=3D GL_COLOR_BUFFER_BIT; break; case MLTAG_current: mask |=3D GL_CURRENT_BIT; break; case MLTAG_depth_buffer:mask |=3D GL_DEPTH_BUFFER_BIT; break; case MLTAG_enable: mask |=3D GL_ENABLE_BIT; break; case MLTAG_eval: mask |=3D GL_EVAL_BIT; break; case MLTAG_fog: mask |=3D GL_FOG_BIT; break; case MLTAG_hint: mask |=3D GL_HINT_BIT; break; case MLTAG_lighting: mask |=3D GL_LIGHTING_BIT; break; case MLTAG_line: mask |=3D GL_LINE_BIT; break; case MLTAG_list: mask |=3D GL_LIST_BIT; break; case MLTAG_pixel_mode: mask |=3D GL_PIXEL_MODE_BIT; break; case MLTAG_point: mask |=3D GL_POINT_BIT; break; case MLTAG_polygon: mask |=3D GL_POLYGON_BIT; break; case MLTAG_polygon_stipple:mask |=3D GL_POLYGON_STIPPLE_BIT; break; case MLTAG_scissor: mask |=3D GL_SCISSOR_BIT; break; case MLTAG_stencil_buffer:mask |=3D GL_STENCIL_BUFFER_BIT; break; case MLTAG_texture: mask |=3D GL_TEXTURE_BIT; break; case MLTAG_transform: mask |=3D GL_TRANSFORM_BIT; break; case MLTAG_viewport: mask |=3D GL_VIEWPORT_BIT; break; } list =3D Field(list,1); } glPushAttrib (mask); return Val_unit; } where is the MLTAG is define like this: struct record { value key;=20 GLenum data; }; static struct record input_table[] =3D { #include "gl_tags.c" }; where: {MLTAG_color, GL_COLOR}, {MLTAG_depth, GL_DEPTH}, {MLTAG_accum, GL_ACCUM}, {MLTAG_stencil, GL_STENCIL}, {MLTAG_points, GL_POINTS}, where: #define MLTAG_color Val_int(-899911325) #define MLTAG_depth Val_int(-685117181) (...) aha! -rwxr-xr-x 1 spec spec 86334 2010-05-31 13:51 var2switch -rwxr-xr-x 1 spec spec 81183 2010-05-31 13:51 var2def plus this: gl_tags.var: (* GLenum *) color depth accum stencil points lines polygon triangles quads line_strip line_loop triangle_strip triangle_fan quad_strip=20=20=20=20=20 (...) gives an answer: they are generated from OCaml code. > Best regards, > --Edwin Wojciech